我使用谷歌的protobuf,我想讀/寫的protobuf的幾個GB使用C++整理數據文件。因爲建議將每個protobuf對象的大小保持在1MB以下,所以我認爲寫入文件的二進制流(如下所示)會起作用。每個偏移量都包含到達下一個偏移量的字節數,直到文件結束。這樣,每個protobuf可以保持在1MB以下,並且我可以將它們放在一起以符合我心中的內容。
[int32 offset]
[protobuf blob 1]
[int32 offset]
[protobuf blob 2]
...
[eof]
我有在Github上起作用的implemntation:
src/glob.hpp
src/glob.cpp
test/readglob.cpp
test/writeglob.cpp
但我覺得我已經寫了一些差的代碼,並希望得到一些建議如何改善它。因此,
問題:
- 我使用
reinterpret_cast<char*>
讀/寫的32位整數從二進制fstream
。由於我使用protobuf,所以我假設所有機器都是小端。我還斷言int
確實是4個字節。 鑑於這兩個限制性假設,是否有更好的方法來讀取/寫入32位整數爲二進制fstream
? - 在從
fstream
讀書,我創建臨時固定長度char
緩衝器,這樣我可以然後通過這個固定長度緩衝器向protobuf的庫中使用ParseFromArray
,作爲ParseFromIstream
將消耗整個流進行解碼。我真的只想告訴圖書館最多讀取fstream
的N
字節,但在protobuf中似乎沒有這種功能。 在fstream
的最多N個字節處傳遞函數的最習慣方法是什麼?或者是我的設計充分顛覆,我應該完全考慮一種不同的方法?
編輯:
- @codymanix:我鑄造
char
因爲istream::read
需要char
數組,如果我沒有記錯。我也沒有使用提取操作符>>
,因爲我讀它是與二進制流使用差的形式。或者這是最後一條忠告嗎? - @Martin York:刪除
new
/delete
有利於std::vector<char>
。glob.cpp
現在已更新。謝謝!
爲什麼你想要首先將int轉換爲char *? – codymanix 2010-08-18 14:30:48