通过IOSTAT
的{{1}}参数检测fortran中的EOF时,如下所示:
READ
nLines=0
DO
READ(unit,'(A)',IOSTAT=Error) Line
IF (Error /= 0) EXIT
nLines=nLines+1
END DO
变量究竟何时获得非零值?是在读取文件的最后一行还是在此之后尝试新的读取时?是否取决于在写入文件时是否使用了Error
指令?它是编译器依赖的吗?
如果它是编译器相关的,我怎么能以更便携的方式计算文件中的行数?
答案 0 :(得分:1)
当read语句未成功完成时,iostat参数将获得非零值。发生错误,或遇到了行结束或记录结束条件。然后,未读取正在读取的变量的值。
因此,如果文件中的最后一个记录(行)被格式化并正确终止,则iostat参数在读取后将为零,并且在后续读取语句中将为非零。
答案 1 :(得分:1)
读取endfile记录时会触发Error
将获得非零值的文件结束条件。此endfile记录是文件中的单独记录(不需要具有物理表现形式),因此,正如Vladimir F states一样,正确的“数据”记录将导致Error
为零。
由endfile
语句写入的结束文件记录始终写为“下一条记录”,因此,特别是,当有记录时,Error
的值不会为非零无论使用endfile
。
此“下一条记录”也适用于通过非前进I / O写入的记录,因此即使在这种情况下,也不会看到(部分)读取记录和文件结尾。
最后,值得一提的是,在文件结束条件下,Error
的值将设置为常量IOSTAT_END
(来自内部模块iso_fortran_env
),因此您可以检查此值以区别于读取错误。