Fortran 尝试读取名称列表后返回的状态不是预期的状态

Fortran 尝试读取名称列表后返回的状态不是预期的状态,fortran,Fortran,我想从一个文件中读取一个名字列表,但是在没有名字列表的情况下实现一个catch选项。从我在书中读到的情况来看,我期望的状态是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

我想从一个文件中读取一个名字列表,但是在没有名字列表的情况下实现一个catch选项。从我在书中读到的情况来看,我期望的状态是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=说明符中的标量int变量定义为

  • 如果既没有出现错误条件、文件结束条件,也没有出现记录结束条件,则为零值

  • 如果INQUIRE语句中的单元号标识内部文件,则来自内部模块ISO_FORTRAN_ENV(13.8.2)的常量IOSTAT_INQUIRE_INTERNAL_单元的处理器相关正整数值

  • 如果出现任何其他错误情况,则与IOSTAT\u INQUIRE\u INTERNAL\u单元不同的处理器相关正整数值

  • 如果出现文件结束条件且未出现错误条件,则常量IOSTAT_END(13.8.2.13)的处理器相关负整数值,或

  • 如果出现记录结束条件且未出现错误条件或文件结束条件,则常量IOSTAT_EOR(13.8.2.14)的处理器相关负整数值

您引用的文档特定于IBM的实现(即使是该版本),并且(不一定)适用于您使用的编译器。因此,对于给定的错误条件,IBM可能会选择使用
84
,而NAG或Intel(etc)可能会选择另一种

此外,Fortran标准没有规定什么是“错误条件”。来自标准(F2008,9.11.1)

输入/输出错误条件集取决于处理器

虽然定义了所谓的记录结束和文件结束条件(不是错误)。当前标准未指定缺少名称列表的名称列表输入文件是否算作错误(以及哪个错误)


还请注意,当出现文件结束条件时,问题程序中的
mystat
值不一定是
-1
。如上所述,在这种情况下,内部模块
ISO_FORTRAN_ENV
中的负值
IOSTAT_END
可移植(对于F2008编译器)用于比较。

是否使用xlf?我不熟悉FORTRAN,但似乎EOF将取代文件中的错误。为什么不添加另一个。或者。对于-1.只需稍微扩展一下francescalus的评论,肯定错误代码取决于编译器。如果您没有使用IBM的编译器,那么数字几乎肯定会有所不同。没有,我使用的是gfortran;我真的不知道xlf是什么,它是IBM的编译器吗?我不知道佩奇的信息只提到了这一点。我没有想到内在过程的错误信息会依赖于编译器。F90/F95的iostat规则是什么?我认为我们目前使用的是F90、F95或最多F2003(我有记忆试图调用ISO_FORTRAN_ENV并接收来自编译器的投诉)。我曾经尝试下载F90或F95标准(事实上,是你推荐我去查看的),但找不到它们(gnu wiki页面上的pdf链接已断开,似乎在其他任何地方都找不到)。状态说明符的含义在F90中没有实质性的不同。当然,旧的标准没有提到内在模块的命名常量,但处理器相关的性质和符号是相同的。F90、F95、F2003、F2008、F2018编译器之间的线有些模糊。您将使用编译器供应商在发布时实现的最新标准的子集,而不是一个标准的真正编译器。关于标准文档,我已经向wiki提交了一个编辑,以供参考。