我想从文件中读取名单,但在名称列表不存在的情况下实现catch选项。根据我在here中读到的内容,我希望状态为84或85.我的代码看起来像这样:
mystat = 0
read( unit = file_unit, nml = lionml, iostat = mystat )
print*, mystat
if ( (mystat == 84) .or. (mystat == 85) ) then
! (no namelist found? Go on, no big deal...)
else
! (other stat problems? This may be problematic...)
end if
但事实并非如此。正在读取的文件没有名称列表lionml,但read指令返回的状态是-1(EOF)而不是84/85。
我是否从引用的来源解释错误的内容?我不明白在哪个案例中我会得到84/85的统计数据......
答案 0 :(得分:4)
您处于所谓的处理器/编译器相关行为的区域。 Fortran的某些方面在某些约束条件下,标准并未完全指定有效程序的结果。
在这里,我们有(Fortran 2008,9.11.5):
执行包含IOSTAT =说明符的输入/输出语句会导致IOSTAT =说明符中的scalar-int-variable被定义为
如果没有出现错误条件,文件结束条件或记录结束条件,则为零值
如果INQUIRE语句中的单元号标识内部文件,则来自内部模块ISO_FORTRAN_ENV(13.8.2)的常量IOSTAT_INQUIRE_INTERNAL_UNIT的依赖于处理器的正整数值
与IOSTAT_INQUIRE_INTERNAL_UNIT不同的依赖于处理器的正整数值,如果发生任何其他错误情况,
如果发生文件结束条件并且没有出现错误情况,则常量IOSTAT_END(13.8.2.13)的依赖于处理器的负整数值,或
如果发生记录结束条件并且没有出现错误条件或文件结束条件,则常量IOSTAT_EOR(13.8.2.14)的依赖于处理器的负整数值。
您引用的文档特定于IBM(甚至该版本)的实现,并且(不一定)适用于您使用的编译器。因此,对于给定的错误条件,IBM可能会选择使用84
,其中NAG或英特尔(等)可能会选择另一个错误。
此外,Fortran标准没有规定什么算作“错误条件”。从标准(F2008,9.11.1)
输入/输出错误条件集取决于处理器
虽然定义了所谓的记录结束和文件结束条件(不是错误)。缺少名单的名单输入文件是否被当前标准指定为错误(以及哪个错误)。
另请注意,发生文件结束条件时问题程序中mystat
的值不一定是-1
。如上所述,在这种情况下,内部模块IOSTAT_END
的负值ISO_FORTRAN_ENV
可以用于比较(对于F2008编译器)。