【问题标题】:Fortran: Check namelist presenceFortran:检查名单是否存在
【发布时间】:2015-08-03 00:34:22
【问题描述】:

到目前为止,我正在检查 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

如何在读取文件之前检查文件中是否存在名称列表?当名称列表不存在并导致文件结束错误时,是否有更优雅的恢复方式?

【问题讨论】:

  • 如果在您关闭并重新打开文件之前名单不存在,为什么之后还要存在?如果你只是想知道你是否通过了名单,你可以在阅读名单之前REWIND它。
  • 在问题的第一部分,我想在完全阅读之前检查名单是否存在。这样我就不会抛出任何错误,这会更加优雅。但是REWIND 正是我在问题的第二部分中寻找的,谢谢! :)
  • 在读取文件之前,您无法确定文件中是否存在名称列表或其他任何内容。要找出答案,必须阅读它。如果另一个进程正在写入文件,除非文件被共享,否则倒带不会帮助您。如果另一个进程已写入文件,则打开和关闭可能会起作用。
  • 当然它必须读取文件,但可能不会影响当前行号。不过,REWIND 对我来说非常好。

标签: fortran


【解决方案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(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)

【讨论】:

    猜你喜欢
    • 2018-09-21
    • 2014-04-27
    • 1970-01-01
    • 2013-05-24
    • 2015-01-04
    • 2021-07-22
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多