Fortran:检查名单存在

时间:2015-05-21 11:13:53

标签: fortran

截至目前,我正在检查iostat是否小于0,如果找不到名单,那么重新打开文件(这真的很难看),即:

read(100, nml=nm_tensor, iostat = ios)
if (ios < 0) then
    close(100)
    open(100, file="input_nm", status='old', action="read", iostat = ios)
end if

在阅读文件之前,如何检查文件中是否存在名单?当名单不存在并导致文件结束错误时,是否有更优雅的方法进行恢复?

1 个答案:

答案 0 :(得分:1)

说你正在阅读的文件是:

&INT_NAMELIST
  A = 1,
  B = 2
/
&REAL_NAMELIST
  X = 3.15,
  Y = 2.71
/

然后程序

INTEGER :: A, B
REAL :: X, Y
NAMELIST /INT_NAMELIST/ A, B
NAMELIST /REAL_NAMELIST/ X, Y
OPEN(unit=100, action="READ", status="OLD")
read(100, nml=INT_NAMELIST)
read(100, nml=REAL_NAMELIST)

可以工作,但是改变了read语句的顺序,它不会:

read(100, nml=REAL_NAMELIST)
read(100, nml=INT_NAMELIST)

因为它已经读过INT_NAMELIST,直到它找到并阅读REAL_NAMELIST。如果您不确定文件中名单的顺序,则应在每个新名单之前使用REWIND,将文件位置重置为文件的开头:

read(100, nml=REAL_NAMELIST)
rewind(100)
read(100, nml=INT_NAMELIST)