尝试读取名称列表后返回的状态不是预期的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试读取名称列表后返回的状态不是预期的相关的知识,希望对你有一定的参考价值。
我想从文件中读取名单,但在名称列表不存在的情况下实现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的统计...
您处于所谓的处理器/编译器相关行为领域。 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编译器)在这种情况下用于比较。
以上是关于尝试读取名称列表后返回的状态不是预期的的主要内容,如果未能解决你的问题,请参考以下文章