Как узнать, что мы достигли EOF в Фортране 77? - PullRequest
0 голосов
/ 28 января 2019

Итак, давайте предположим, что у меня есть следующая подпрограмма:

         subroutine foo(a_date)
         character*10 dummy, a_date
         open(unit=1,file='ifile.txt',status='old')
         read(1, 100) dummy
   100   format(A10)
         a_date = dummy
         return
         end

, которая только читает строку из файла.Но я хочу прочитать все строки рекурсивно.Поэтому, когда я вызываю подпрограмму рекурсивно в моей основной процедуре, я получаю ошибку после достижения EOF.Так есть ли способ предотвратить это, чтобы программа знала, когда я достигну EOF?По сути, я хочу знать, когда я достигну EOF.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вот два метода.Я отказываюсь преподавать устаревший Фортран 77, который не должен был использоваться или обучаться в течение 25 лет +, но первый метод должен работать в любой версии Фортрана, начиная с 77

Метод 1:

ijb@ianbushdesktop ~/stackoverflow $ cat data.dat 
1
2
3
ijb@ianbushdesktop ~/stackoverflow $ cat end.f90
Program eof
  Implicit None
  Integer :: data
  Open( 10, file = 'data.dat' )
  Do
     Read( 10, *, End = 1 ) data
     Write( *, * ) data
  End Do
1 Write( *, * ) 'Hit EOF'
End Program eof
ijb@ianbushdesktop ~/stackoverflow $ gfortran -std=f2003 -Wall -Wextra -O -fcheck=all end.f90 
ijb@ianbushdesktop ~/stackoverflow $ ./a.out
           1
           2
           3
 Hit EOF

Метод 2:

Это требует F2003, но это то, что вы должны использовать в эти дни

ijb@ianbushdesktop ~/stackoverflow $ cat data.dat 
1
2
3
ijb@ianbushdesktop ~/stackoverflow $ cat end2.f90
Program eof
  Use, intrinsic :: iso_fortran_env, Only : iostat_end
  Implicit None
  Integer :: data, error
  Open( 10, file = 'data.dat' )
  Do
     Read( 10, *, iostat = error ) data
     Select Case( error )
     Case( 0 )
        Write( *, * ) data
     Case( iostat_end )
        Exit
     Case Default
        Write( *, * ) 'Error in reading file'
        Stop
     End Select
  End Do
  Write( *, * ) 'Hit EOF'
End Program eof
ijb@ianbushdesktop ~/stackoverflow $ gfortran -std=f2003 -Wall -Wextra -O -fcheck=all end2.f90 
ijb@ianbushdesktop ~/stackoverflow $ ./a.out
           1
           2
           3
 Hit EOF
0 голосов
/ 28 января 2019

В Фортране 77 вы используете атрибут END=label , он дает программе команду выполнить заданное значение label при срабатывании условия конца файла.В основном это работает как оператор GO TO, запускаемый оператором READ.

...