【发布时间】:2015-07-15 22:14:59
【问题描述】:
我目前正在尝试 C++ 读取 Fortran 编写的二进制文件,但没有取得多大成功。写入文件的 Fortran 代码不是我自己的,虽然 C++ 解析例程是。
二进制文件的第一条记录已使用以下语句写入:
INTEGER var1 var2 var3
WRITE(12,REC=1) var1,var2,var3
执行成功读取的 Fortran sn-p 如下所示:
open(unit=10,file="ETC.bin",access='direct',recl=24,iostat=iost,status='old')
read (unit=10,rec=1) var1,var2,var3
close(unit=10)
print*,var1,var2,var3
在 C++ 方面,到目前为止,我提出了以下几点:
FILE* binfile = fopen("ETC.bin","rb") ;
fseek (binfile,0,SEEK_END) ;
long lSize = ftell (binfile) ;
char* buffer = (char*) malloc (sizeof(char)*lSize) ;
rewind (binfile) ;
size_t result=fread(buffer,1,96,binfile) ;
for (unsigned i = 0; i<=result; i++){
printf("%f\n",buffer[i]) ;
}
不幸的是,我的 C++ printf 语句返回的是废话。请注意,我假设 Fortran 依赖于 4 位字(例如 gfortran 编译器),并且如果使用 ifort,则
--assume byterecl
编译时需要选项。
我知道结果应该是什么,但我不确定如何在 C++ 中复制 Fortran 读取语句的行为。
感谢您的帮助!
附:这里贴了一个类似的问题:reading fortran binary file in c++,指向下面的dead link。那里没有太多信息,或者我的 Google-Fu 很糟糕。
【问题讨论】:
-
您应该首先确认用于写入文件的计算机与读取文件的计算机是字节序兼容的。
-
是按字还是按记录?我遇到过字节序的话题,但我认为这不会是一个问题。
-
这将是基于单词的。如果读写计算机是相同的字节序,这可能不是问题,但如果它们不同,它将使您的程序调试变得非常困难。 This thread has a simple implementation for checking endianness
-
你应该去阅读working with files in C++。
-
4位字应该是4字节字?