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

File io Fortran可以直接从二进制文件读取字节吗?,file-io,binary,fortran,byte,fortran90,File Io,Binary,Fortran,Byte,Fortran90,我有一个二进制文件,我想用Fortran读取。问题是它不是用Fortran编写的,所以它没有记录长度指示符。因此,通常的未格式化Fortran读取将无法工作 我有一个想法,我可以偷偷地将文件作为格式化文件读取,逐字节(或4字节乘4字节,实际上)读取到字符数组中,然后通过传递函数或可怕的等价语句将字符内容转换为整数和浮点。但这不起作用:我尝试一次读取4个字节,根据inquire语句的POS输出,读取跳过大约6000个字节,字符数组被加载垃圾 所以这是不可能的。在这个方法中是否有一些细节我忘记了?还

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

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

所以这是不可能的。在这个方法中是否有一些细节我忘记了?还是说在Fortran中有一种根本不同的更好的方法来实现这一点?(顺便说一句,我还试着读入一个
整数*1
数组和一个字节数组。即使这些代码可以编译,但当读语句时,代码崩溃了。)

是的

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
您可能仍然存在endianess和数据类型大小的问题,但这些方面与语言无关


如果您是按照Fortran 2003之前的语言标准编写的,那么对适当的整数变量进行无格式的直接访问读取可能会起作用-这是Fortran处理器特有的,但适用于当前的许多处理器。

效果非常好!谢谢我还以为我能熟练使用FORTRAN 90。现在有更多的东西要学!好吧。非常感谢。没有“流”访问,Fortran read将一些数据解释为记录信息的长度。这两种方法都跳过了要读取的数据,并导致记录长度错误。另外,该文件实际上没有Fortran意义上的记录。@M.S.B.:如果如OP所示,他第一次尝试格式化读取,我猜它会向前扫描,直到碰到换行符。@janneb,是的。在正常格式的读操作中,Fortran将填充请求的字符串,然后丢弃记录的其余部分。您可以使用格式化的流IO覆盖它@M.S.B.不提前输入是避免丢弃其余记录所需的。推进格式化流以与推进格式化顺序相同的方式将文件定位在刚刚读取的记录之后。格式化流和格式化顺序都存在返回字节模式的问题,这些字节模式看起来像换行符和/或记录分隔符。