3

我有一个由 fortran 代码生成的二进制文件。该文件包含一个双精度数组。我需要在我的 C 程序中打开它,然后像使用通常的数组一样使用它。

我该怎么做?

二进制文件中如何表示双精度类型?

4

3 回答 3

7

几乎所有的 Fortran 编译器,对于未格式化(即二进制)的顺序文件,都会在每条记录的开头和结尾写入记录的长度。通常长度以 4 个字节写入,尽管一些编译器使用 8 个字节。记录是使用单个 Fortran 写入语句写入的所有内容。如果这个数组是用单个 Fortran 写语句和这种类型的文件写入的,那么你有四到八个字节要跳过,然后是数组,然后是四到八个额外的字节。您可能可以通过使用十六进制编辑器查看文件来解决这个问题。如果数组是用多个写语句分段写入的(例如,按列或行),则每条记录都将具有这种结构。

如果文件由 Fortran 以未格式化的形式写入,则 Fortran double 类型以该计算机的二进制表示形式写入。您应该能够在相同类型的计算机上以 C 语言阅读它。如果您正在更改架构而不仅仅是语言,则二进制表示可能会有所不同。

Fortran 有其他不包含记录长度信息的文件访问方法。例如,直接访问。流访问的新方法是为跨语言兼容性而设计的。

如果数组是多维的,您可能需要转置它,因为 Fortran 具有列优先数组,而 C 使用行优先。

相关问题:Fortran unformatted file format and reading fortran unformatted file with python

于 2013-03-03T20:23:59.937 回答
1

原则上你不能。

Fortran 二进制文件的格式未指定。这意味着,尽管您可以将程序状态保存在 Fortran 二进制文件中,并使用相同的 Fortran 实现重新打开它,但即使使用不同的 Fortran 实现,您也不能可靠地这样做。

现在,可以理智地保存状态的方法数量有限,因此您有可能也很可能能够计算出给定 Fortran 二进制文件的结构,并且足够详细,您可以在其中打开它C 程序并读取内容。然而,这些知识完全特定于所讨论的 Fortran 编译器。

所以最好的办法是创建一个包含 的 Fortran 数组,例如,[0, 1, 2, 3, 4, 256, 65536, 65537, 1e10, 1e20, 1e30, 1e40]将其写入二进制文件,然后用二进制编辑器查看它,看看里面有什么。

之后,恐怕你就一个人了……

于 2013-03-03T20:15:45.910 回答
1

在我自己看来,读取 fortran 二进制文件的更好方法实际上是从 fortran读取它们并将数组传递给 C。它可以为您节省很多痛苦。

  1. 编写一个实际上可以读取这个二进制文件的子程序
  2. 包装您的子例程以从 C 中调用它。

最难的部分是包装你的 fortran 子例程。C 和 fortran 之间的名称修改不是直接的。这取决于您使用的编译器(即平台)和 Fortran 版本。您可以在此处此处查看简单示例。

第一选择是使用适当的编译选项“手动”完成。

提示:要了解修饰,您可以在 linux 中使用nm命令或 DLL 导出查看器之类的工具。

更好的选择是使用Fortran 2003,它引入了有助于处理此类操作的模块iso_c_binding 。

于 2013-03-05T12:53:40.783 回答