背景
我正在使用Google的protobuf,我想使用C ++读取/写入几千兆字节的protobuf编组数据到文件中。由于建议将每个protobuf对象的大小保持在1MB以下,我认为写入文件的二进制流(如下图所示)可行。每个偏移量包含到达下一个偏移量的字节数,直到达到文件末尾。通过这种方式,每个protobuf都可以保持在1MB以下,我可以将它们全部融合到我的内心。
[int32 offset]
[protobuf blob 1]
[int32 offset]
[protobuf blob 2]
...
[eof]
我有一个适用于Github的实现:
src/glob.hpp
src/glob.cpp
test/readglob.cpp
test/writeglob.cpp
但是我觉得我写了一些不好的代码,并且会对如何改进代码表示赞赏。因此,
问题:
reinterpret_cast<char*>
从二进制fstream
读取/写入32位整数。由于我使用的是protobuf,我假设所有的机器都是小端的。我还声称int
确实是4个字节。 考虑到这两个限制性假设,是否有更好的方法将32位整数读/写为二进制fstream
?fstream
读取时,我创建了一个临时的固定长度char
缓冲区,这样我就可以将这个固定长度的缓冲区传递给protobuf库,使用ParseFromArray
进行解码,因为ParseFromIstream
将使用整个流。我真的更喜欢告诉库最多读取N
的下一个fstream
字节,但是protobuf中似乎没有这个功能。 在fstream
的最多N个字节传递函数最常用的方法是什么?或者我的设计是否完全颠倒以至于我应该完全考虑采用不同的方法?修改
char
投标,因为如果我没有弄错的话,istream::read
需要一个char
数组。我也没有使用提取运算符>>
,因为我读它是用于二进制流的糟糕形式。或者这最后一条建议是假的吗?new
/ delete
,转而使用std::vector<char>
。 glob.cpp
现已更新。谢谢!答案 0 :(得分:2)
不要使用新的[] /删除[]。
相反,我们在发生异常时保证std :: vector作为解除分配。
不要假设读数会返回您请求的所有字节 检查gcount()以确保您得到了所要求的内容。
而不是让Glob根据构造函数中的开关实现输入和输出的代码。而是实现两个专门的类,如ifstream / ofstream。这将简化界面和使用。