Fortran正在读取endfile记录之外的内容

Mat*_*ira 5 fortran data-files gfortran eof

我正在尝试从文件中读取一些数据,并且结束文件记录检测对于停止读取非常重要.但是,根据用于读取数据的数组的数组维度,我无法正确检测到endfile记录,并且我的Fortran程序停止.

该计划如下:

!integer, dimension(3) :: x                      ! line 1.1
!integer, dimension(3,10) :: x                   ! line 1.2
integer, dimension(10,3) ::                      ! line 1.3
integer :: status,i=1
character(len=100) :: error

open( 30, file='data.dat', status='old' )
do
  print *,i
  !read( 30, *, iostat=status, iomsg=error ) x          ! line 2.1
  !read( 30, *, iostat=status, iomsg=error ) x(:,i)     ! line 2.2
  read( 30, *, iostat=status, iomsg=error ) x(i,:)      ! line 2.3

  if ( status < 0 ) then        print *,'EOF'
    print *,'total of ',i-1,' lines read.'
    exit
  else if ( status > 0 ) then
    print *,'error cod: ',status
    print *,'error message: ', error
    stop
  else if ( status == 0 ) then
    print *,'reading ok.'
    i = i + 1
  end if
end do
Run Code Online (Sandbox Code Playgroud)

使用'data.dat'文件:

10 20 30
30 40 50
Run Code Online (Sandbox Code Playgroud)

当取消注释第1.3和2.3行时,会出现上述错误:

错误码:5008

错误消息:读取过去的ENDFILE记录

但是,使用第1.1和2.1行,或1.2和2.2,程序可以正常工作,检测结束文件记录.

所以,我想帮助理解为什么我不能使用第1.3行和第2.3行来正确读取这个文件,因为我为读命令提供了正确数量的数组元素.

我正在使用gfortran编译器,版本6.3.0.

编辑:更简单的例子

以下产生5008"读取过去的ENDFILE记录"错误:

implicit none
integer x(2,2),s
open(20,file='noexist')
read(20,*,iostat=s)x
write(*,*)s
end
Run Code Online (Sandbox Code Playgroud)

如果我们制作x标量或一维数组(任何大小),我们得到预期的-1EOF标志.文件实际上不存在或为空是无关紧要的.如果文件包含一些但不够的数据,则很难理解您可能获得的返回值.

小智 -1

我不确定我的表达是否正确,但这与 fortran 读取和存储二维数组的方式有关。当您使用此表示法时:x(:,i),该列i实际上会内联扩展,并且使用这一行代码读取项目。x(i,:)在使用where 的另一种情况下,将读取该行,就像多次i调用一样。read如果您想坚持特定的形状和大小,可以使用隐式循环。例如你可以使用类似的东西:read( 30, *, iostat=status, iomsg=error ) (x(i,j), j=1,3)

在任何情况下,您都应该检查您的数据是否正确存储在变量中(至少按照预期)x