我有一个由 fortran 代码生成的二进制文件。该文件包含一个双精度数组。我需要在我的 C 程序中打开它,然后像使用通常的数组一样使用它。
我该怎么做?
二进制文件中如何表示双精度类型?
我有一个由 fortran 代码生成的二进制文件。该文件包含一个双精度数组。我需要在我的 C 程序中打开它,然后像使用通常的数组一样使用它。
我该怎么做?
二进制文件中如何表示双精度类型?
几乎所有的 Fortran 编译器,对于未格式化(即二进制)的顺序文件,都会在每条记录的开头和结尾写入记录的长度。通常长度以 4 个字节写入,尽管一些编译器使用 8 个字节。记录是使用单个 Fortran 写入语句写入的所有内容。如果这个数组是用单个 Fortran 写语句和这种类型的文件写入的,那么你有四到八个字节要跳过,然后是数组,然后是四到八个额外的字节。您可能可以通过使用十六进制编辑器查看文件来解决这个问题。如果数组是用多个写语句分段写入的(例如,按列或行),则每条记录都将具有这种结构。
如果文件由 Fortran 以未格式化的形式写入,则 Fortran double 类型以该计算机的二进制表示形式写入。您应该能够在相同类型的计算机上以 C 语言阅读它。如果您正在更改架构而不仅仅是语言,则二进制表示可能会有所不同。
Fortran 有其他不包含记录长度信息的文件访问方法。例如,直接访问。流访问的新方法是为跨语言兼容性而设计的。
如果数组是多维的,您可能需要转置它,因为 Fortran 具有列优先数组,而 C 使用行优先。
相关问题:Fortran unformatted file format and reading fortran unformatted file with python
原则上你不能。
Fortran 二进制文件的格式未指定。这意味着,尽管您可以将程序状态保存在 Fortran 二进制文件中,并使用相同的 Fortran 实现重新打开它,但即使使用不同的 Fortran 实现,您也不能可靠地这样做。
现在,可以理智地保存状态的方法数量有限,因此您有可能也很可能能够计算出给定 Fortran 二进制文件的结构,并且足够详细,您可以在其中打开它C 程序并读取内容。然而,这些知识完全特定于所讨论的 Fortran 编译器。
所以最好的办法是创建一个包含 的 Fortran 数组,例如,[0, 1, 2, 3, 4, 256, 65536, 65537, 1e10, 1e20, 1e30, 1e40]
将其写入二进制文件,然后用二进制编辑器查看它,看看里面有什么。
之后,恐怕你就一个人了……
在我自己看来,读取 fortran 二进制文件的更好方法实际上是从 fortran读取它们并将数组传递给 C。它可以为您节省很多痛苦。
最难的部分是包装你的 fortran 子例程。C 和 fortran 之间的名称修改不是直接的。这取决于您使用的编译器(即平台)和 Fortran 版本。您可以在此处和此处查看简单示例。
第一选择是使用适当的编译选项“手动”完成。
提示:要了解修饰,您可以在 linux 中使用nm命令或 DLL 导出查看器之类的工具。
更好的选择是使用Fortran 2003,它引入了有助于处理此类操作的模块iso_c_binding 。