Io 顺序fortran读取中的EOF

Io 顺序fortran读取中的EOF,io,fortran,Io,Fortran,在fortran中通过READ的IOSTAT参数检测EOF时,如下所示: nLines=0 DO READ(unit,'(A)',IOSTAT=Error) Line IF (Error /= 0) EXIT nLines=nLines+1 END DO Error变量何时获得非零值?是在读取文件的最后一行时,还是在此之后尝试进行新的读取?它是否取决于写入文件时是否使用了结束文件指令?它依赖于编译器吗 如果它依赖于编译器,如何以更方便的方式计算文件中的行数?当read语句未成功完成

在fortran中通过
READ
IOSTAT
参数检测EOF时,如下所示:

nLines=0
DO
  READ(unit,'(A)',IOSTAT=Error) Line
  IF (Error /= 0) EXIT
  nLines=nLines+1
END DO
Error
变量何时获得非零值?是在读取文件的最后一行时,还是在此之后尝试进行新的读取?它是否取决于写入文件时是否使用了
结束文件
指令?它依赖于编译器吗


如果它依赖于编译器,如何以更方便的方式计算文件中的行数?

当read语句未成功完成时,iostat参数将获得非零值。发生错误,或者遇到行结束或记录结束条件。然后,正在读取的变量的值是未定义的


因此,如果文件中的最后一条记录(行)被正确格式化和终止,iostat参数在读取后将为零,并且在随后的read语句中将为非零。

当读取endfile记录时,将触发文件结束条件,
Error
将获得非零值。此endfile记录是文件中的一个单独记录(不需要物理显示),因此,正确的“数据”记录将导致
错误
为零

endfile
语句写入的endfile记录始终作为“下一条记录”写入,因此,特别是当成功读取记录时,
Error
的值不会为非零,而不管使用的是
endfile

此“下一条记录”也适用于通过非前进I/O写入的记录,因此即使在这种情况下,也看不到(部分)读取记录和文件结束


最后,值得一提的是,在文件结束条件下,
Error
的值将被设置为常量
IOSTAT\u end
(来自内部模块
iso\u fortran\u env
),这样您就可以检查该值以区分读取错误。

为什么不在堆栈溢出时询问@我在谷歌上搜索了“fortran stackexchange”,找到了这个,它看起来比堆栈溢出更合适、更具体。但是如果在那里更合适,这个问题可以被移动还是我应该重新发布在那里?如果你喜欢它,你的选择要么是让版主迁移,要么在这里删除,然后在SOJellby作为一个新问题发布-你可能会在这一个上得到一个更好的答案,因为它正在深入研究语言本身的细节。对于您的问题,目前有3张选票可以迁移到SO。耐心一点,你的问题会自动迁移到SO,你不需要重新发布。这就是我的想法,在这种情况下,我的问题代码是“正确的”。但我一直在观察英特尔编译器在某些系统中的相反行为(上次读取记录,
IOSTAT
negative),通过添加
ENDFILE
“修复”了这种情况。令人烦恼的是,我无法创建一个测试用例,因此似乎还有其他事情在进行。检查它是文件结尾负数,还是记录结尾负数(使用
iso\u fortran\u env
中的常量)可能很有价值
close
ing文件或正常程序终止应该像
endfile
一样在文件中放置endfile记录。那么,也许还要检查编写程序是否没有错误终止?也可能是文件本身在系统中被正确终止。@Jellby读取我的最后一个参数:“如果文件中的最后一条记录(行)被正确格式化和终止”。您的输入文件中可能违反了此条件。@VladimirF是的,我知道,但该文件是由相同的代码用纯
WRITE
s和
CLOSE
编写的,除英特尔外,几乎任何编译器都能正常工作。我可能需要进一步调查。