2017-03-02 46 views
1

我正在學習C++中的二進制文件。我有一個關於在二進制文件中讀寫結構或類的問題。例如,如果我有這樣的結構,將結構保存在二進制文件中並只讀取C++中的值

struct A { 
    char a1; 
    int a2; 
    double a3; 
}; 

,然後我可以節省的結構與代碼一樣,

A a = {'a', 2, 3.5}; 
ofstream file; 
file.open("file.dat", ios::binary); 
file.write((char*)&a, sizeof(a)); 
file.close(); 

的問題是,我可以讀不整的結構,但只有結構中的價值?例如,如果我想讀取結構的整數值,那麼,

ifstream file; 
int i = 1; 
file.open("file.dat", ios::binary); 
file.seekg(sizeof(char), ios::beg); 
file.read((char*)&i, sizeof(i)); 
file.close(); 

這可能嗎?如果不是,有沒有辦法只讀取結構的一個值?

+0

結構不對齊的,所以你應該保持一致, –

+0

有結構成員之間的填充。 'a2'與結構的起始位置偏移4,而不是假設偏移1。使它成爲'file.seekg(offsetof(A,a2),ios :: beg);'。畢竟,閱讀整個結構可能會更容易。 –

+0

二進制文件通常取決於平臺。研究「Endianess」。而且,指針不可移植,特別是在同一個可執行文件的調用之間。 –

回答

0

查看我的二進制可移植性材料以獲取有關二進制文件及其問題的一般想法。

即使您打算在同一個程序中再次讀取它,將整個結構寫入磁盤也是一個壞主意。但是,如果你這樣做,你可以在磁盤上創建一個二進制映像。你可以記錄。它將由char字節,各種大小的大或小的endian整數,指針(對你完全無用)以及浮點類型的雙精度和浮點數組成。

一旦你知道了格式,你可以輕鬆地閱讀它。對整數做這個有點棘手,同時避免算術溢出。浮點值非常困難。但是,該網站的代碼可以讓您輕鬆讀取浮點數據。

緊跟着fread()的fwrite()將會起作用,直到編譯器更改其結構佈局策略。但是由於轉移到了64位,所以現在一直在這麼做。

https://github.com/MalcolmMcLean/ieee754