Как читать с определенной строки и писать в конце того же файла с помощью Fortran? - PullRequest
0 голосов
/ 27 марта 2019

У меня есть файл, который выглядит следующим образом:

 -7307.5702506795660       -13000.895251555605       -11777.655135862333       0.52503289678626652       0.51683849096298218        31.160950279498426       -7307.5698242187500       -13000.900390625000       -11777.658203125000     
  -7307.5712457548034       -13000.883260393683       -11777.647978916109       0.52714817702425010       0.84740489721298218        20.800333023071289       -7307.5698242187500       -13000.900390625000       -11777.658203125000

Я прочитал его с кодом, подобным следующему:

   open(1,file='my_file.txt',status='old')
   do
    read(1,*,end=10) xe,ye,ze,the,phe,enel,x0,y0,z0
    ...some mathematical calculations
   end do
10 close(1)

Что мне нужно сделать сейчас, это добавить результатмои вычисления в конце того же файла того же файла и продолжение чтения моего файла после строки, которую я вычислял с помощью .

Как я могу сделать это на Фортране?

1 Ответ

1 голос
/ 29 марта 2019

Вы можете легко сделать это, отслеживая линию, на которой вы находитесь во время чтения.Однако вам необходимо убедиться, что у вас есть запасной выход, потому что, когда вопрос задан, цикл не закончится, пока вы не заполните свой диск.

Я также сомневаюсь, что это необходимо.Я бы использовал выделяемый массив, установил бы его больше, чем вы думаете, и затем имел бы подпрограмму для проверки количества и корректировки размера в определенных кусках.

В любом случае, вот полностью функциональный пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...