【发布时间】:2010-08-18 14:16:53
【问题描述】:
背景:
我正在使用 Google 的 protobuf,我想使用 C++ 将数 GB 的 protobuf 编组数据读/写到文件中。由于建议将每个 protobuf 对象的大小保持在 1MB 以下,我认为写入文件的二进制流(如下图所示)会起作用。每个偏移量包含到下一个偏移量的字节数,直到到达文件末尾。这样一来,每个 protobuf 可以保持在 1MB 以下,我可以随心所欲地将它们 glob 在一起。
[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将消耗整个流。我真的更愿意告诉库最多从fstream读取下一个N字节,但protobuf 中似乎没有该功能。 传递fstream的最多 N 个字节的函数的最惯用方法是什么?或者我的设计是否足够颠倒,我应该考虑完全不同的方法?
编辑:
- @codymanix:我正在转换为
char,因为如果我没记错的话,istream::read需要一个char数组。我也没有使用提取运算符>>,因为我读到它与二进制流一起使用的形式很差。还是这最后一条建议是假的? - @Martin York:删除
new/delete以支持std::vector<char>。glob.cpp现已更新。谢谢!
【问题讨论】:
-
为什么要首先将 int 转换为 char*?
标签: c++ protocol-buffers