Fortran可以直接从二进制文件中读取字节吗?

时间:2012-07-19 21:31:36

标签: file-io binary fortran byte fortran90

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

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

所以这是不行的。我忘了这种方法有一些细节吗?或者在Fortran中只有一种根本不同且更好的方法吗? (顺便说一句,我也试过读入integer*1数组和一个字节数组。即使这些代码会编译,但是当它出现在read语句中时,代码崩溃了。)

1 个答案:

答案 0 :(得分:10)

是。

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处理器的,但适用于许多当前处理器。