Вы можете легко сделать это, отслеживая линию, на которой вы находитесь во время чтения.Однако вам необходимо убедиться, что у вас есть запасной выход, потому что, когда вопрос задан, цикл не закончится, пока вы не заполните свой диск.
Я также сомневаюсь, что это необходимо.Я бы использовал выделяемый массив, установил бы его больше, чем вы думаете, и затем имел бы подпрограмму для проверки количества и корректировки размера в определенных кусках.
В любом случае, вот полностью функциональный пример:
program test
implicit none
integer :: iunit, max
integer :: iline
real :: xe,ye,ze,the,phe,enel,x0,y0,z0
iunit = 1
max = 20
open(iunit,file='my_file.txt',status='old')
iline = 0
do
iline = iline + 1
read(iunit,*,end=10) xe, ye, ze, the, phe, enel, x0, y0, z0
! call calculation(?)
xe = xe / 1000. ! just to see a difference in the file
call append(iunit, iline, xe, ye, ze, the, phe, enel, x0, y0, z0)
! bettter have this emergency exit, because file will never hit end using append
if (iline > max) exit
end do
10 close(iunit)
contains
subroutine append(iunit, iline, xe, ye, ze, the, phe, enel, x0, y0, z0)
implicit none
integer, intent(in) :: iunit, iline
real, intent(in) :: xe, ye, ze, the, phe, enel, x0, y0, z0
integer :: i
! skip to end
do
read(iunit,*,end=20)
end do
20 continue
backspace(iunit) ! back off the EOF
! append to file
write(iunit,*) xe, ye, ze, the, phe, enel, x0, y0, z0
! rewind file and skip to iline
rewind(iunit)
i = 0
do
i = i + 1
read(iunit,*)
if (i == iline) exit
end do
end subroutine append
end program test