如何在Fortran 77中确定文件大小
我有一个Fortran程序,需要读取ASCII文件,但是文件列表有时包含大小为0的文件。然后程序在试图读取此文件时崩溃。到目前为止,我还没有找到任何方法来标记这样一个文件 我的代码中有以下READ语句如何在Fortran 77中确定文件大小,fortran,Fortran,我有一个Fortran程序,需要读取ASCII文件,但是文件列表有时包含大小为0的文件。然后程序在试图读取此文件时崩溃。到目前为止,我还没有找到任何方法来标记这样一个文件 我的代码中有以下READ语句 read(10,220,END=320,ERR=195)parm(1:) 虽然我希望代码可以转到语句195或语句320,但不会崩溃,它会崩溃 这就是当文件大小为零时代码崩溃的地方,并显示以下消息 ... fmt: end of file apparent state: unit 10 named
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
查询(unit=10,SIZE=nsize)
,但程序无法编译IOSTAT
的值是相同的,与文件大小无关正如Ian所指出的,任何现代Fortran编译器都应该具有
INQUIRE
。一个简单的测试
program foo
integer sz
inquire(file='tmp.dat',size=sz)
print *, sz
end program foo
如果tmp.dat文件集为空,请创建一个供我们查看的文件集。例如,在这里,我们如何确保程序在您所说的时间点崩溃?它可能在其他地方。打开大小为零的文件时,这不是错误,因此如果您需要以某种方式测试文件的大小,请告诉我们inquire语句是如何编译失败的。请注意inquire(…,size=…)在超过四分之一个世纪的时间里并不是过时的一部分,并且删除了Fortran 77标准。相反,它是Fortran 2003的一部分,这很好,因为这是您应该使用的。对于符合标准的Fortran 77代码(我发现要了解为什么有人仍在使用Fortran 77编译器),您可以用
inquire(FILE='tmp.dat',RECL=SZ)替换上面的inquire语句
。如果设备未连接,至少gfortran总是将RECL=设置为0或-1,因此它不会给出文件的大小。正如@janneb所提示的,文件必须在查询(…,RECL=)之前连接。
返回任何可能有用的内容。更糟糕的是,在F77下,必须连接才能直接访问。更糟糕的是,inquire(file=filename,recl=rl);打印*,rl
(转换为F77)在F77下实际上是非法的,除非文件连接正确。