gpt4 book ai didi

file - gnu FORTRAN 未格式化文件记录标记存储为 64 位宽度?

转载 作者:行者123 更新时间:2023-12-02 01:34:27 25 4
gpt4 key购买 nike

我有一个遗留代码和它读取的一些未格式化的数据文件,它适用于 gnu-4.1.2。我无权访问最初生成这些数据文件的方法。当我使用较新的 gnu 编译器 (gnu-4.7.2) 编译此代码并尝试在另一台计算机上加载旧数据文件时,读取它们很困难。我首先打开文件并读取由三个 32 位整数组成的第一条记录:

open(unit, file='data.bin', form='unformatted', status='old')
read(unit) x,y,z

我期望这三个整数在这里描述 x、y、z 跨度,以便接下来它可以加载具有相同维度的 float 值的 3D 矩阵。但是,它会为第一个值加载 0,然后接下来的两个值会发生偏移。

期待:

x=26, y=127, z=97    (1A, 7F, 61 in hex)

已加载:

x=0, y=26, z=127     (0, 1A, 7F in hex)

当我在十六进制编辑器中检查数据文件时,我想我明白发生了什么。

hex editor

在这种情况下,第一个记录标记的值为 12(0C,十六进制),因为它读取三个整数,每个 4 字节.此标记存储在记录之前之后。但是,我注意到紧跟在每个记录标记之后的 32 位是 00000000。因此,要么将记录标记视为 64 位整数(小端),要么在每个记录标记后有一个 32 位零填充。无论哪种方式,新编译器生成的代码都将记录标记读取为 32 位整数,并且不需要任何填充。这有效地侵入/破坏了正在读入的数据。

有没有一种简单的方法可以解决这个不可移植的问题?新旧硬件都是 64 位架构,我编译的可执行文件也是。如果我再次尝试使用较旧的编译器版本,它是否会解决问题,或者它是否依赖于硬件?我更愿意使用较新的编译器,因为它们效率更高,而且我真的不想编辑源代码以将所有文件打开为 access='stream' 并手动读入在每个记录标记之后尾随 0 整数,在每个记录之前和之后。

附言如果没有更简单的替代方法,我可能会编写 C++ 代码来更改数据文件并删除这些零填充。

最佳答案

请参阅 gfortran 手册中的 -frecord-marker= 选项。使用 -frecord-marker=8,您可以读取由旧版本的 gfortran 生成的旧式未格式化顺序文件。

关于file - gnu FORTRAN 未格式化文件记录标记存储为 64 位宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32054106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com