尝试读取名单后返回的状态不是预期的

时间:2018-03-02 22:31:15

标签: fortran

我想从文件中读取名单,但在名称列表不存在的情况下实现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的统计数据......

1 个答案:

答案 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编译器)。