【问题标题】:Fortran error: "end of file" while reading character in namelistFortran 错误:读取名称列表中的字符时出现“文件结尾”
【发布时间】:2017-11-16 18:01:49
【问题描述】:

我正在编写一个 Fortran 应用程序,我遇到了这个问题。当我定义一个名单如下:

CHARACTER(100) :: INPUT_DIR, OUTPUT_DIR, ROOT_DIR    
NAMELIST /IODIR/ INPUT_DIR, OUTPUT_DIR

然后我从文件中读取IODIR

READ(FUNIT,IODIR, ERR=99)

文件中的数据是:

&IODIR INPUT_DIR="Input", OUTPUT_DIR="Output" /

但是会报错

“文件结束”。

变量的长度似乎比文件中定义的要长。我不知道如何为字符变量设置分隔符,或者在名单中读取未知字符。我使用GNU Fortran 构建。

【问题讨论】:

  • 您确定是 read 导致了错误吗?看起来没问题,即使出现问题,您也不会收到错误消息,而是会分支到标签 99。
  • @agentp err= 仅用于在错误条件下进行分支。
  • @francescalus 对。我已经很久没有使用它们了。我认为err 也会捕获 EOF(毕竟这是一个错误)。在任何情况下基于测试(intel&gnu),即使行尾没有换行符,显示的代码也不会产生文件结束错误。
  • 尝试读取超出文件末尾的内容会触发文件结尾条件@agentp,而不是错误条件。
  • 我发现,当程序读取文件中的最后一个名单时,它到达了文件的末尾。如果我们在 EOF 中再添加一行(可以是空行),程序将通过。非常感谢!

标签: fortran character end-of-life


【解决方案1】:

我在使用在线 gfortan 编译器时遇到了同样的问题,安装版本的结果相同。这个问题遍布网络,所以在使用可靠来源的基础上我: 在 Windows 10 Bash 中安装了 gfortran - 一切都很好。 在 Cygwin 中安装了 gfortran - 一切正常。

【讨论】:

  • 注意OP的这条评论:“我发现,当程序读取文件中的最后一个名单时,它会到达文件的末尾。如果我们在EOF中再添加一行(可以是空行),程序会通过。” 这可能是关键。有些 GCC 版本会接受这样的文件,有些则不会。可移植的解决方案是不要通过文件结束标记突然结束文件。
猜你喜欢
  • 2018-05-28
  • 2015-03-06
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多