【问题标题】:How to determine file size in Fortran 77如何确定 Fortran 77 中的文件大小
【发布时间】:2019-08-05 18:10:25
【问题描述】:

我有一个需要读取 ASCII 文件的 Fortran 程序,但是文件列表有时会包含一个大小为 0 的文件。然后程序在尝试读取此文件时崩溃。到目前为止,我还没有找到任何方法可以让我标记这样的文件。

我的代码中有以下 READ 语句

read(10,220,END=320,ERR=195)parm(1:)

虽然我希望代码转到语句 195 或语句 320,但不会崩溃,但它会崩溃

这是文件大小为零时代码崩溃的地方,并显示以下消息

...
fmt: end of file
apparent state: unit 10 named junko.con
last format: (A)
lately reading sequential formatted external IO
  1. 我尝试使用 INQUIRE 语句 inquire (unit=10,SIZE=nsize),但是程序无法编译

  2. OPEN语句在打开零大小文件时没有报错,IOSTAT的值是一样的,与文件大小无关

【问题讨论】:

  • 请创建一个minimal reproducible example 供我们查看。例如,在这里,我们如何确定程序在您所说的那一刻崩溃?它可能在其他地方。
  • 打开一个大小为零的文件不会出错,所以如果你需要以某种方式测试文件的大小,那么请告诉我们查询语句是如何编译失败的。跨度>
  • 请注意 Inquire( ..., Size = ... ) 在超过 25 年的时间里不属于过时的 Fortran 77 标准。相反,它是 Fortran 2003 的一部分,这很好,因为这是您应该使用的。

标签: fortran


【解决方案1】:

正如 Ian 所说,任何现代 Fortran 编译器都应该有 INQUIRE。一个简单的测试

program foo
  integer sz
  inquire(file='tmp.dat',size=sz)
  print *, sz
end program foo

使用空的 tmp.dat 文件集 sz=0

【讨论】:

  • 对于符合标准的 Fortran 77 代码(我明白为什么有人仍在使用 Fortran 77 编译器),您可以将上述查询语句替换为 INQUIRE(FILE='tmp.dat',RECL=SZ)
  • 如果单元未连接,至少 gfortran 总是将 RECL= 设置为 0 或 -1,因此它不会给出文件的大小。
  • 正如@janneb 提示的那样,必须在inquire(..., recl=) 返回任何可能有用的东西之前连接文件。更糟糕的是,在 F77 下必须连接它才能直接访问。更糟糕的是,inquire(file=filename, recl=rl); print *, rl(转换为 F77)在 F77 下实际上是非法的,除非文件连接正确。
猜你喜欢
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2010-09-05
  • 1970-01-01
  • 2013-06-27
相关资源
最近更新 更多