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)
二進制文件的數據結構能夠正確讀寫。