C++結構體序列化讀寫二進制文件類


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后labelconstName內容正確,后面結構數值不正確。

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)

二進制文件的數據結構能夠正確讀寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM