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

bob*_*nto 7 binary file-io byte fortran fortran90

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

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

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

Ian*_*anH 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
Run Code Online (Sandbox Code Playgroud)

您可能仍然遇到有关endianess和数据类型大小的问题,但这些方面与语言无关.

如果您在Fortran 2003之前编写语言标准,那么未格式化的直接访问读取到合适的整数变量可能会起作用 - 它是特定于Fortran处理器但适用于许多当前处理器.

  • @MSB非前进输入是避免丢弃其余记录所需的输入.推进格式化的流将文件放在刚读取的记录之后,其方式与推进格式化顺序相同.格式化流和格式化顺序都存在返回看起来像换行符和/或记录分隔符的字节模式的问题. (2认同)