我使用谷歌的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