2010-03-24 78 views
4

我有一個結構與2個整數,我想將它們存儲在一個二進制文件,並再次閱讀。C++如何將整數存儲到二進制文件?

這裏是我的代碼:

static const char *ADMIN_FILE = "admin.bin"; 
struct pw { 
    int a; 
    int b; 
}; 

void main(){ 
    pw* p = new pw(); 
    pw* q = new pw(); 
    std::ofstream fout(ADMIN_FILE, ios_base::out | ios_base::binary | ios_base::trunc); 
    std::ifstream fin(ADMIN_FILE, ios_base::in | ios_base::binary); 
    p->a=123; 
    p->b=321; 
    fout.write((const char*)p, sizeof(pw)); 
    fin.read((char*)q, sizeof(pw)); 
    fin.close(); 
    cout << q->a << endl; 
} 

我得到的輸出是0。誰能告訴我有什麼問題?

+0

'fin.write'? 'fin.read',當然。這是真實的代碼嗎?在打開文件輸入前,您可能需要刷新/關閉輸出流。 – 2010-03-24 14:42:40

回答

5

在讀取它之前,您可能需要刷新fout

要刷新流,請執行下列操作:

fout.flush(); 

這樣做的原因是,fstreams普遍希望儘可能長的時間,以降低成本,以緩衝輸出。要強制清空緩衝區,請在流上調用flush。

+0

ops .. sori ..錯誤輸入...我實際上使用fin.read ... tq .. – blaxc 2010-03-24 14:44:46

+0

如果我添加了flush命令,它可以正常工作。 – 2010-03-24 14:46:49

+0

woot!我通過沖洗fout來獲得廣告... tq非常多...我知道爲什麼我需要衝洗它嗎? – blaxc 2010-03-24 14:48:30

0
fin.write((char*)q, sizeof(pw)); 

或許應該

fin.read((char*)q, sizeof(pw)); 
+0

我改變了它...我實際上使用fin.read而不是fin.write ...所以..這裏有什麼問題? tq爲你迴應.. – blaxc 2010-03-24 14:45:49

0

但是要注意,你的方法假設有關大小和你的整數的字節順序和你的結構的包裝的東西,沒有一個是一定要去,如果是真實的你代碼被移植到另一臺機器上。

由於可移植性的原因,您希望有輸出例程分別輸出結構的字段,並輸出具有特定字節順序的特定位寬的數字。這就是爲什麼有序列化軟件包。

3

將整數存儲到文件時,可以使用htonl(),ntohl()系列函數來確保以正確的格式讀取它們,而不管該文件是否在大端機器上寫出,並且回讀後來在一個小型機器上。這些功能旨在用於網絡使用,但在寫入文件時可能很有用。

0

嘗試這樣的:

fout.write((const char*)&p, sizeof(pw)); 
fin.read((char*)&q, sizeof(pw)); 

代替

fout.write((const char*)p, sizeof(pw)); 
fin.read((char*)q, sizeof(pw)); 

vagothcpp(yournotsosmartC++程序員= P)

相關問題