|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
我们常常需要在linux环境下读取由Fortran创建的二进制文件,如果考虑用C/C++的程序来实现读取的话,则有必须注意的地方。
这个技巧在处理linux服务器下Fortran程序CFD求解器算出的二进制流场数据时很有用。因为我们可以用C/C++来制作流场处理的软件。
如Fortran程序:
program a
real x,y,z
integer im
im = 70
x = 3.14
y = 9.6
z = 1975
open(1,file="d.dat",form='unformatted')
write(1) x
write(1) im
write(1) y
write(1) z
close(1)
end program a
而相应的C/C++程序来读取上述“d.dat”中的数据:
#include <fstream>
#include <iostream>
using namespace std;
#define BF_SEEKG_BEG 4
#define BF_SEEKG_RET 8
void main()
{
float x,y,z;
int im;
fstream mfile;
mfile.open("d.dat",ios::in|ios::binary);
mfile.seekg(BF_SEEKG_BEG,ios::beg);
mfile.read((char*)&x,sizeof(x));
mfile.seekg(BF_SEEKG_RET,ios::cur);
mfile.read((char*)&im,sizeof(im));
mfile.seekg(BF_SEEKG_RET,ios::cur);
mfile.read((char*)&y,sizeof(y));
mfile.seekg(BF_SEEKG_RET,ios::cur);
mfile.read((char*)&z,sizeof(z));
mfile.close();
cout<<"x="<<x<<" y="<<y<<" z="<<z<<endl;
cout<<"im="<<im<<endl;
cout<<"well done"<<endl;
}
可以看到,关键的地方在:
#define BF_SEEKG_BEG 4
#define BF_SEEKG_RET 8
这就是说,Fortran文件的开头要占4位,并且每个换行符号要占8位,同样,空白行也要占8位。
那么Fortran的CFD的求解器运行在Windows环境下,得到的二进制结果数据又该如何用C/C++读取?很简单,在上述的C++代码中,只需要改动:
#define BF_SEEKG_BEG 2
#define BF_SEEKG_RET 2
这样就可以了。
另外,C/C++的这些改动只取决于二进制数据是由Fortran在linux还是windows环境中生成的,而与C/C++程序的运行环境无关。
以上纯属个人经验,如有不当之处,请各位指出。
|
|