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