2

根据您的经验,在 Fortran 90 中,将大型数组存储在输出文件中的最佳方式是什么?以前,我一直在尝试将大型数组写入 ASCII 文本文件。例如,我会做这样的事情(感谢页面底部的建议In Fortran 90, what is a good way to write a array to a text file, row-wise?):

PROGRAM testing1
  IMPLICIT NONE
  INTEGER :: i, j, k
  INTEGER, DIMENSION(4,10) :: a

  k=1
  DO i=1,4
    DO j=1,10
      a(i,j)=k
      k=k+1
    END DO
  END DO

  OPEN(UNIT=12, FILE="output.txt", ACTION="WRITE", STATUS="REPLACE")
  DO i=1,4
    DO j=1,10
      WRITE(12, "(i2,x)", ADVANCE="NO") a(i,j)
    END DO
    WRITE(12, *)
  END DO
  CLOSE(UNIT=12)
END PROGRAM testing1

这行得通,但正如 In Fortran 90 中最上面的回复所指出的那样,将数组写入文本文件的好方法是什么?,将大数组写入文本文件非常慢,并且创建的文件大小比所需的要大。那里的海报建议改为写入未格式化的 Fortran 二进制文件,使用如下内容:

PROGRAM testing2
  IMPLICIT NONE
  INTEGER :: i, j, k
  INTEGER, DIMENSION(4,10) :: a

  k=1
  DO i=1,4
    DO j=1,10
      a(i,j)=k
      k=k+1
    END DO
  END DO

  OPEN(UNIT=13, FILE="output.dat", ACTION="WRITE", STATUS="REPLACE", &
      FORM="UNFORMATTED")
  WRITE(13) a
  CLOSE(UNIT=13)
END PROGRAM testing2

正如这里的回复所承诺的,这似乎有效,并且确实更快并且文件大小更小。但是,如果我希望以后能够处理存储在 Fortran 二进制文件(例如上面的 output.dat)中的数据并分析其内容,我该怎么办?例如,如果我想在 Microsoft Excel 等程序中打开存储在二进制文件中的数组怎么办?

当我在上一篇文章中提到 matlab 时回复建议我将二进制文件作为十六进制文件打开,然后从中找出并提取记录。但是,我很担心我会进入深水区,因为我之前没有十六进制侦查方面的经验。当我在 matlab 板(此处: http: //www.mathworks.com/matlabcentral/answers/12639-advice-on-reading-an-unformatted-fortran-binary-file-into-matlab)上询问有关阅读 Fortran 文件的问题时进入matlab,那里的人建议使用Fortran流可能很容易。但是,Fortran 流(即,使用命令ACCESS="STREAM"中的OPEN指令)在时间和文件大小上是否可能与我在上面的第一个示例中创建的 ASCII 文本文件相似?

或者,您知道是否有任何其他软件可以自动将 Fortran 二进制文件读入某种人类可读的形式?(或者,你知道关于十六进制侦查或 Fortran 流的任何好的教程吗?)

非常感谢您的宝贵时间。

4

3 回答 3

3

Stream 是一个独立于格式化/非格式化选项的选择——一个是“访问”,另一个是“格式” Fortran I/O 的默认设置是面向记录的访问。Fortran 编译器用于记录(至少未格式化)的典型方法是在每条记录之前和之后写入 4 字节的记录长度。(“之后”是为了使向后阅读更容易。)使用十六进制编辑,您可以验证我描述的这些额外数据项并在 MatLab 中跳过它们。但它们不是语言标准的一部分,也不是可移植的,而且在其他语言中肯定不明显。如果您选择流且未格式化,您将只获得与您的数据项相对应的原始字节序列——在其他语言中无需担心额外的数据项!以我的经验,这个输出在其他语言中往往相当容易阅读(未在 MatLab 中尝试过)。如果这是一个小而简单的项目,文件可移植到其他计算机不是问题,我可能会使用这种方法(流和未格式化)而不是文件格式规范,如 HDF5 或 FITS。我会把数组写成 write (13) a,就像你最后一个例子一样。根据其他语言,您可能必须转置维度。如果这是一个关注可移植性的长期项目,那么一个可移植的标准文件接口是值得考虑的。unformatted) 而不是 HDF5 或 FITS 等文件格式规范。我会把数组写成 write (13) a,就像你最后一个例子一样。根据其他语言,您可能必须转置维度。如果这是一个关注可移植性的长期项目,那么一个可移植的标准文件接口是值得考虑的。unformatted) 而不是 HDF5 或 FITS 等文件格式规范。我会把数组写成 write (13) a,就像你最后一个例子一样。根据其他语言,您可能必须转置维度。如果这是一个关注可移植性的长期项目,那么一个可移植的标准文件接口是值得考虑的。

我不知道这些格式是否可以从 Excel 中读取。更多研究......您可能必须编写一个程序来读取任何格式的二进制文件并以 Excel 可以理解的格式输出文件。

于 2011-08-01T22:40:05.697 回答
2

(将评论转换为后代的答案)

您是否专门尝试将信息输入 Matlab?如果你是,我强烈推荐HDF5。这是您一直在寻找的可移植二进制格式。

要将 Fortran 二进制文件转换为 HDF5,您必须读取原始 Fortran 二进制文件,然后将相同的数据写入 HDF5 文件。如果你有 Fortran 源代码,这应该很容易。分配您的数组,确保您以与写入数组相同的顺序读取数组,然后写出新的闪亮 HDF5 文件。

HDF5 组有C 和 Fortran 示例教程。可能有一个非常接近你想要做的例子。构建 HDF5 时,请确保手动启用 Fortran 支持。默认情况下禁用。

于 2011-08-01T22:10:47.257 回答
2
 %In MATLAB

 fid=fopen('YOUR_FILE.direct','r');  %Fortran Direct ACCESS
 frewind(fid);

 tbb=ones(367,45203);

     for i =1:367
          temp=fread(fid,[45203],'single');
          tbb(i,:)=temp; 
     end

fclose(fid)
于 2012-01-05T07:54:16.607 回答