C与C++的二进制文件读写
参考下面的文章,C/C++读写文本文件、二进制文件
https://blog.csdn.net/nichengwuxiao/article/details/78789225
C的文件操作
#include <stdio.h>
ephDE_recOne rec; // 结构定义
FILE * f = fopen("file_name","rb"); // 文件打开
if(f == NULL) return; // 打开失败
fread(&rec, sizeof(ephDE_recOne),1, f); // 读二进制文件数据
fclose(f);
C++的文件操作
#include <iostream>
#include <fstream>
ephDE_recOne rec; // 结构定义
ifstream infile("file_name",ios::in | ios::binary); // 文件打开
if(!infile) return; // 打开失败
infile.read((char *)&rec, sizeof(double)*deLen); // 读二进制文件数据
infile.close();
C++的二进制文件读取结构体问题
在编写一个DE405星历文件的读取函数中,结构体读取后数值与实际的不一致。
在下面这段代码中,读取struct后label
与constName
内容正确,后面结构数值不正确。
struct ephDE_recOne{
char label[3][84];
char constName[400][6];
double timeData[3];
int numConst;
double AU;
double EMRAT;
int coeffPtr[12][3];
int DENUM;
int libratPtr[3];
int RSize;
};
const int deLen = 1018;
void read(){
using namespace std;
ephDE_recOne rec;
ifstream infile(DE_file_path.c_str(), ios::in | ios::binary);
if(!infile)
throw exception();
infile.read((char *)&rec, sizeof(double)*deLen);
infile.close();
}
通过比较读取结果与实际数值发现,读取到的AU
数值为实际的EMRAT
数值。因此猜测是数据结构体的发生了错位情况。
代码编译的字节对齐问题 #pragma pack(push,1)
由于不是专业出身,这个内存字节的原因不能说清楚。原来在用fortran编写带有通信接口的程序时曾遇到过类似问题,虽然代码不做改动,但是否指定单字节内存对齐将影响数据处理的结果。
这里,我使用的是Qt的mingw32编译套件编译的程序,将上述代码的结构定义修改为
#pragma pack(push, 1)
struct ephDE_recOne{
char label[3][84];
char constName[400][6];
double timeData[3];
int numConst;
double AU;
double EMRAT;
int coeffPtr[12][3];
int DENUM;
int libratPtr[3];
int RSize;
};
#pragma pack(pop)
二进制文件的数据结构能够正确读写。
网友评论