如何知道我们在Fortran 77中达到了EOF?

时间:2019-01-28 09:58:28

标签: io fortran readfile fortran77

因此,假设我有以下子例程:

         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 :(得分:1)

在Fortran 77中,您使用END=label attribute,它在触发文件结尾条件时指示程序进入给定的label。基本上,它的工作原理类似于GO TO语句触发的READ语句。

答案 1 :(得分:1)

这是两种方法。我拒绝讲授过25年以上不应使用或过时的过时的Fortran 77,但第一种方法应该适用于从77开始的任何版本的Fortran中。

方法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