file-io - 以Fortran : Status,格式打开二进制文件,访问权限

标签 file-io binary fortran fortran77

我已经使用Fortran多年了,但是文件I/O仍然令我迷茫。我对statusformaccessrecl的理解是有限的,因为在研究生院只需要某些用例。
我知道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 信息的平面二进制文件,这将如何更改?更重要的是,在哪里有一个更好的链接来更详细地描述这些术语:statusformaccessrecl

最佳答案

我不愿意这样做,但是我觉得如果我希望在这篇文章中找到答案,前进的道路将不明确。所以这是前进的道路。

短版

在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 定义进入每个记录的字节数。例如,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/

    相关文章:

    c++ - 如何在 C++ 中接受用户的二进制输入?

    c++ - Scala等与C/C++/Fortran的性能比较?

    c++ - 如何包装 C __cdecl API 以便 FORTRAN 可以调用它(使用 __stdcall)?

    C 编程位表示

    haskell - 如何实现十进制到二进制的转换

    module - Fortran 模块版本 fatal error

    python - 如何将两个列表中的数据写入 csv 中的列?

    java - 检查文件是否已复制

    c# - 将文件保存在我的项目中的指定文件夹中

    python - 下载图片,要保存到文件夹,检查文件是否存在