2010-11-11 42 views
10

如果我這樣做了以下內容:爲什麼我不能用operator >>讀取fstream的二進制數據?

ifstream file; 
file.open("somefile", ios::binary); 

unsigned int data; 

file >> data; 

我流將始終將failbitdata將保持未初始化。但是,如果我讀取的是charunsigned char,則表示流正常。 perror()告訴我「結果太大」。

我在Google上看到的唯一一個建議是,operator>>不應該用於二進制數據(更喜歡read()),但我發現操作員更清潔,更易於使用 - 並且它不需要鑄造一切。

有人可以解釋這個問題嗎?

回答

10

iostream extraction operator (>>)嘗試解釋由空格分隔的數字字符串,而不是二進制數據。有許多不同的方式來編碼二進制形式的無符號整數(例如,在little-endian byte order中的32位2's complement representation)。這就是爲什麼你必須使用read/write函數來操作這樣的二進制緩衝區。

但是,沒有什麼能夠阻止你使用插入和提取操作符以任何形式實現你自己的類來序列化二進制數據。這樣的類可能會在內部使用ifstream對象的讀取函數。或者,boost serialization library可能已經完全符合您的要求。

0

它應按照您所描述的方式完成。但是,C++標準設計師並不十分優雅。事實上,C++設計中存在很多缺陷,即使是C++ 11和C++ 14也存在很多缺陷。

理想的C++設計應該是:

1.對於文本文件:

ifstream fin_txt("input.txt"); 
int i; 
float j; 
double k; 
fin_txt >> i >> j >> k; 

這將在3串讀和解析成整數,float和double,並將它們存儲到我,j和k分別。

2.對於二進制文件:

ifstream fin_txt("input.bin", ios::binary); 
int i; 
float j; 
double k; 
fin_txt >> i >> j >> k; 

這將在4/8字節讀(取決於是否INT是32位或64位),4個字節和8個字節的二進制數據,並將其儲存分別轉換爲i,j和k。

不幸的是,當前設計是報告案例2的錯誤。也許這可以在C++ 22中實現。

+0

你的答案中有這樣的原因:「取決於int是32位還是64位」。目前,使用''的代碼是可移植的,您的建議不是。 – Caleth 2017-08-31 11:03:23

相關問題