背景:
我正在使用谷歌的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读取时,我创建了一个临时的固定长度字符缓冲区,这样我就可以将这个固定长度的缓冲区传递给protobuf库,使用ParseFromArray进行解码,因为ParseFromIstream将使用整个流.我真的更喜欢告诉图书馆最多读取来自fstream的下一个N字节,但似乎在protobuf中没有这个功能.在fstream的最多N个字节传递函数最常用的方法是什么?或者我的设计是否完全倒置,我应该完全考虑采用不同的方法?
编辑:
> @ codymanix:我正在转向char,因为istream::read
需要一个char数组,如果我没有弄错的话.我也没有使用提取运算符>>因为我读到它与二进制流一起使用的形式很差.或者这最后一条建议是假的吗?
> @ Martin York:删除了new / delete,转而使用std :: vector< char>. glob.cpp现在已更新.谢谢!
最佳答案 不要使用new [] / delete [].
相反,我们在异常情况下保证std :: vector作为解除分配.
不要假设读取将返回您请求的所有字节.
检查gcount()以确保您得到了所要求的内容.
而不是让Glob根据构造函数中的开关实现输入和输出的代码.而是实现两个专门的类,如ifstream / ofstream.这将简化界面和使用.