2010-03-19 18 views
3

我需要在二進制模式下一堆無符號整數寫入std::ofstream寫整數集到std :: ofstream的,並能夠讀取他們回來

std::ofstream f; 
f.open("some path", std::ios::out | std::ios::binary); 
// some loop 
{ 
    unsigned int k = get_k(); // may product numbers from 0 to 65535 
    f << k; 
} 
f.close(); 

他們被寫入到輸出文件「爲是「沒有任何分隔符。所以當我試圖用std::ifstream讀回他們(期望得到我寫的)時,我會得到很奇怪的值。我做錯了什麼?

或者我應該把' '(空格)添加到數據流中以將它們分開嗎?

謝謝。

+5

您是否認爲ios :: binary會使您的流輸出整數爲二進制,而不是ASCII? (我自己曾經有過這種誤解。) – 2010-03-19 15:07:30

回答

3

operator<<生成格式化文本作爲其輸出,所以是的,你需要在數字之間加上某種空格來分隔它們。否則,它們將全部一起運行成一個巨大的數字串,並且當你讀回它們時,它將繼續將數字作爲數字的一部分讀取,直到它溢出 - 例如,如果您三次寫入1,則會以111的方式讀回。

4

您正在使用operator<<()將格式化文本輸出到流中。因此,您可以將明文寫入二進制文件,這種方式會破壞以二進制模式寫入的目的。嘗試在文本編輯器中打開輸出文件並親自查看。

您有兩種選擇:在文本模式下書寫並用空格分隔您的值(因爲在使用格式化輸出時以二進制模式寫入會引起誤導),或者使用流的write()方法進行強制轉換。

f.write(reinterpret_cast<char*>(&k), sizeof(int)); 
// ... 
f.read(reinterpret_cast<char*>(&k), sizeof(int)); 

我個人比較喜歡用文本模式寫作。這意味着擁有更清晰的代碼和便攜式輸出文件。如果你一定要壓縮文件。

相關問題