我已经使用Fortran多年了,但是文件I/O仍然令我迷茫。我对status
,form
,access
,recl
的理解是有限的,因为在研究生院只需要某些用例。
我知道Fortran二进制文件在文件顶部具有描述文件大小的额外信息。但这对我来说从来就不是一个问题,因为我只需要处理Fortran代码中的Fortran文件,那里的额外信息是必需的,但是却是不可见的。
但是,如何在Fortran中打开平面二进制文件?
过去,我可能会通过执行以下操作来使用Fortran打开一个Fortran二进制文件:
open(id,file=file_name,status='old',
+ form='unformatted',access='direct',recl=4,iostat=ok)
if (ok .ne. 0) then
write(1,20) id,ok,file_name
else
write(1,21) id,file_name
但是,对于没有Fortran header 信息的平面二进制文件,这将如何更改?更重要的是,在哪里有一个更好的链接来更详细地描述这些术语:
status
,form
,access
,recl
?
最佳答案
我不愿意这样做,但是我觉得如果我希望在这篇文章中找到答案,前进的道路将不明确。所以这是前进的道路。
短版
在Fortran 77/90中,要打开标准的Fortran二进制文件,您可以编写:
OPEN (5, FILE="myFile.txt")
但是,要打开一个平面的非Fortran二进制文件,您将必须编写类似以下内容的文件:
OPEN(5, file="myFile.txt", form='unformatted', access='direct', recl=1)
这种差异是因为Fortran样式的二进制文件在文件中的每个“记录”周围都有一个4字节的页眉和页脚。这些页眉/页脚描述了记录中包含的数据的大小。 (在最常见的情况下,您遇到的每个二进制文件将只有一个记录。)
长版
Fortran假定有许多默认的
open
参数。实际上,我们的原始示例可以用以下详细形式编写,以显示所有假定的默认值。OPEN (5, FILE="myFile.txt")
OPEN (5, FILE="myFile.txt", FORM="FORMATTED",
+ ACCESS="SEQUENTIAL", STATUS="UNKNOWN")
让我们看一下每个参数:
form='formatted'
)还是二进制数据(form='unformatted'
)组成。 access='sequential'
)还是以所需顺序(access='direct'
)从文件中读取数据。 recl=1
只是说记录长度是每个字节1个字节。也许它们是1个字节的整数。 STATUS="UNKNOWN"
参数表示该文件可能尚不存在,但如果不存在,则将创建该文件。如果要防止覆盖旧文件,请使用STATUS="OLD"
。同样,如果您知道该文件尚不存在,则需要使用:STATUS="NEW"
。 有关更多信息:
这些打开的语句还会对随后的读/写/关闭语句产生影响。在我的原始帖子中,我需要知道,如果您打开直接访问文件,则必须写入直接访问文件。 (也就是说,二进制文件中不会包含Fortran header /页脚。)但是,Fortran的默认功能是创建包含Fortran header 和页脚的顺序访问文件。
有关Fortran 77/90中
open
语句的更多信息,在线上有很好的资源:Bishop大学的Lin Jinsen的A nice page(非常感谢)。
IBM的Slightly more official documentation,用于其编译器。
关于file-io - 以Fortran : Status,格式打开二进制文件,访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9998262/