找回密码
 注册
查看: 2310|回复: 1

[原创]二进制文件读取(经验)

[复制链接]
发表于 2003-9-30 13:19:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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++程序的运行环境无关。
以上纯属个人经验,如有不当之处,请各位指出。  
发表于 2004-3-17 16:52:58 | 显示全部楼层

[原创]二进制文件读取(经验)

我才到流体中文两天,感觉你真牛,有空多交流,我的E-mail:jfdoctor.student@sina.com.cn
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表