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。