File io 用Fortran打开二进制文件:状态、形式、访问

File io 用Fortran打开二进制文件:状态、形式、访问,file-io,binary,fortran,fortran77,File Io,Binary,Fortran,Fortran77,我已经使用Fortran多年了,但是文件I/O对我来说仍然很模糊。我对状态,表单,访问,recl的理解是有限的,因为我在研究生院只需要某些用例。 我知道Fortran二进制文件在文件顶部有额外的信息来描述文件的大小。但这对我来说从来都不是问题,因为我只需要在Fortran代码中处理Fortran文件,其中额外的信息是必要的,但不可见 但是如何用Fortran打开一个平面的二进制文件呢 在过去,我可能会通过以下操作使用Fortran打开Fortran二进制文件: open(id,file=file

我已经使用Fortran多年了,但是文件I/O对我来说仍然很模糊。我对
状态
表单
访问
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
OPEN(5, file="myFile.txt", form='unformatted', access='direct', recl=1)

但是,对于一个没有Fortran头信息的平面二进制文件来说,这是如何改变的呢?更重要的是,哪里有一个很好的链接可以更详细地描述这些术语:
状态
表单
访问
recl

您可以告诉
open
在Fortran 2003中使用新的流IO模式与
access='Stream'
一个警告是
recl
中给出的记录长度默认为具有未格式化记录的4字节字数(至少在英特尔编译器上,使用
byterecl
进行其他指定),因此,您可能必须指定编译器选项或使用
recl=1

正如您的代码所示,使用无格式和直接,确保正确读取数据所需做的就是选择适当的记录长度。但是,一些FORTRAN编译器并不总是很好地处理未格式化的二进制文件,我建议继续采用

如果可用,编译器可能允许
recordtype='stream'

open (id, file=file_name, status='old', form='unformatted' &
        , access='stream', iostat=ios)
! read (id, pos=1) someValue

如果不能使用流访问,则必须使用直接访问。请参阅“答案”中的链接。

我不喜欢这样做,但我觉得如果我希望在这篇文章中找到答案,那么前进的道路将不明确。这就是前进的方向

简本

在Fortran 77/90中,要打开标准Fortran二进制文件,您可以编写:

OPEN (5, FILE="myFile.txt")
但是,要打开一个平面的非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
OPEN(5, file="myFile.txt", form='unformatted', access='direct', recl=1)
这种差异是因为Fortran样式的二进制文件在文件中的每个“记录”周围都有一个4字节的页眉和页脚。这些页眉/页脚描述记录中包含的数据的大小。(在最常见的情况下,您遇到的每个二进制文件只有一条记录。)

长版本

Fortran假定有许多默认的
打开的
参数。事实上,我们的原始示例可以用下面的详细形式编写,以显示假定的所有默认值

OPEN (5, FILE="myFile.txt") 
OPEN (5, FILE="myFile.txt", FORM="FORMATTED", 
     +   ACCESS="SEQUENTIAL", STATUS="UNKNOWN")
让我们看看每个论点:

  • 表单定义文件是由文本(
    FORM='formatted'
    )还是二进制数据(
    FORM='unformatted'
    )组成

  • ACCESS定义您是按顺序(
    ACCESS='sequential'
    )还是按任意顺序(
    ACCESS='direct'
    )从文件中读取数据

  • RECL定义进入每个记录的字节数。例如,
    recl=1
    只是说记录长度为每个1字节;也许它们是1字节整数

  • 状态定义文件是否已存在。
    STATUS=“UNKNOWN”
    参数表示该文件可能还不存在,但如果不存在,则将创建该文件。如果要防止在旧文件上写入,请使用:
    STATUS=“old”
    。类似地,如果您知道该文件尚不存在,则需要使用:
    STATUS=“NEW”

有关更多信息:

这些打开语句也会对后面的读/写/关闭语句产生影响。在我最初的帖子中,我需要知道,如果你打开一个直接访问文件,你必须写入一个直接访问文件。(也就是说,二进制文件中不会包含Fortran页眉/页脚。)但是,Fortran的默认功能是创建包含Fortran页眉和页脚的顺序访问文件

有关Fortran 77/90中的
open
语句的更多信息,请参阅联机参考资料:

毕晓普大学的林金森(非常感谢)


编译器。

嗯,当我说“C++”二进制时,我指的是一个原始的、平面的二进制文件,它恰巧是由C++程序编写的。文件格式将是。。。不管怎样,一个由1字节整数的行和列填充的平面二进制文件。显然,我主要关心的是,如果一个二进制文件没有通常的Fortran头文件,那么我就试图用Fortran来读取该文件。那么,无论是哪种语言创建的,它都是完全无关的,会分散你对实际问题的注意力。编辑出来,删除C++标签。这看起来很公平。我把它放在标题和文本中,希望强调这些是我试图阅读的常用Fortran二进制文件。只要这还清楚,我很高兴。Fortran direct access二进制文件中没有额外的头信息!对于顺序未格式化文件,您可以获得记录控制字,但直接IO未格式化文件尽可能简单。将一个8字节的实数写入磁盘将得到一个正好包含这8个字节的文件。@haraldkl已经击败了我。只有顺序访问文件才能提供额外的位,而不知道这一点让我感到了极大的调试痛苦。你怎么能坚持使用Fortran 77,现在已经没有编译器了,无法编译F90?@haraldkl-然而,有很多无知的用户拒绝学习更新的版本,坚持使用F77,不管这听起来多么愚蠢。我总是问,为什么不使用Fortran IV呢?您总是可以使用F77将现有代码编译到静态库中,然后将其链接到F90项目中。通过在OpenS中使用stream关键字,没有向后兼容性问题