Fortran:检查名单是否存在
Fortran: Check namelist presence
截至目前,我正在检查 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
如何在读入文件之前检查文件中是否存在名单?当名称列表不存在并导致文件结束错误时,是否有更优雅的恢复方法?
假设您正在阅读的文件是:
&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(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)
截至目前,我正在检查 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
如何在读入文件之前检查文件中是否存在名单?当名称列表不存在并导致文件结束错误时,是否有更优雅的恢复方法?
假设您正在阅读的文件是:
&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(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)