7

我有一个二进制文件,我想用 Fortran 读取。问题是它不是由 Fortran 编写的,所以它没有记录长度指示符。所以通常的未格式化的 Fortran 读取将不起作用。

我有一个想法,我可能会偷偷摸摸地将文件作为格式化文件逐字节(或 4 字节乘 4 字节,实际上)读取到字符数组中,然后将字符的内容转换为整数并通过浮点数传递函数或可怕的等价语句。但这不起作用:我尝试一次读取 4 个字节,并且根据inquire语句的 POS 输出,读取跳过了大约 6000 个字节,并且字符数组加载了垃圾。

所以这是不行的。我忘记了这种方法中有一些细节吗?或者在 Fortran 中是否有一种完全不同且更好的方法来做到这一点?(顺便说一句,我也尝试读入一个integer*1数组和一个字节数组。即使这些代码可以编译,但当涉及到 read 语句时,代码崩溃了。)

4

1 回答 1

11

是的。

Fortran 2003 在语言中引入了流访问。在此之前,大多数处理器都支持与扩展等效的东西,可能称为“二进制”或类似的东西。

未格式化的流访问不会对文件强加任何记录结构。例如,要从对应于特定 Fortran 处理器的配套 C 处理器(如果有)中的单个 int 的文件中读取数据:

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT
INTEGER, PARAMETER :: unit = 10
CHARACTER(*), PARAMETER :: filename = 'name of your file'
INTEGER(C_INT) :: data
!***
OPEN(unit, filename, ACCESS='STREAM', FORM='UNFORMATTED')
READ (unit) data
CLOSE(unit)
PRINT "('data was ',I0)", data

您可能仍然会遇到字节序和数据类型大小的问题,但这些方面与语言无关。

如果您正在写入 Fortran 2003 之前的语言标准,则可以将未格式化的直接访问读取到合适的整数变量中 - 它是 Fortran 处理器特定的,但适用于许多当前处理器。

于 2012-07-19T22:30:51.967 回答