這可能是一個比較基礎的問題,但由於剛開始學習c++,但是對我來說,結構體快速從二進制文件讀取數據,給我解決了很大的問題,這里我把方法寫出來,和有需要的人分享一下,高手看到了請多包涵。
我的二進制文件是按照結構體規定的格式進行存儲的,結構體成員比較多,數據量比較大。結構體結構如下:
-
-
struct MY_PARAM{
-
int m_atten;
-
double m_vbw, m_rbw;
-
double m_refPower, m_markerPower;
-
double m_centerFreqMHz, m_spanMHz, m_startFreqMHz, m_stopFreqMHz, m_markerFreqMHz;
-
double m_span, m_sweep;
-
int m_spectrum_points;
-
int m_iData[1024];
-
};
讀取二進制文件時,如果按照一個數據一個數據去讀的話,需要編寫非常多重復的代碼,執行效率也比較慢。於是我就想有沒有辦法可以吧從二進制文件讀取的數據按照格式直接存放到結構體所在的內存,剛開始我打算用指針,進行內存拷貝,但是嘗試了很久沒有成功,因為QDataStream好像不支持內存拷貝(個人看法,可能使用方法不對)。
然后我就想其它辦法,打算用容器實現,翻書進行查找的時候,突然翻到了共用體,然后就按照書上給的例子進行嘗試,最后嘗試成功。代碼如下:
-
//#pragma pack(push)
-
//#pragma pack(1)
-
union FILE_READBUFFER{
-
MY_PARAM m_param;
-
char header_pt[sizeof(m_param)];
-
};
-
//#pragma pack(pop)
共用體定義如上,內容很簡單,就是包含一個結構體和一個char類型的數組,大小和結構體的大小相同。其中
-
-
//#pragma pack(1)
-
……
-
//#pragma pack(pop)
這幾句是定義內存對其方式的,這個需要和保存文件時的對其方式進行對應,括號中1就是1字節對其,4就是四字節對齊,本來我打算用1字節對其,結果發現讀取的部分數據錯誤,后來就把這幾句注釋掉了,按照默認格式進行對其,結果沒有錯誤。
從二進制文件讀取數據,然后直接賦值給結構體的代碼如下:
-
QString filename=QFileDialog::getOpenFileName( this,tr("Open Files"),"",tr("Files(*.dat)"));
-
ReadDataFile(filename);
-
QFile myfile(filename);
-
myfile.open(QIODevice::ReadOnly);
-
QDataStream myfile_data(&myfile);
-
FILE_READBUFFER app_file_readbuffer;
-
myfile_data.readRawData(app_file_readbuffer.header_pt, sizeof(app_readbuffer));
這樣就完成了全部的從二進制文件讀取數據並把值賦給結構體,后面就可以使用結構體中的數據了。
代碼進行過刪減,可能部分地方有錯誤,有需要的朋友可以按照我這個思路自己編程進行驗證。