我尝试使用msgbox
将数据流序列化为文件。
文件由标题和数据的未知数量的条目组成。
到目前为止,这是我的伪代码:
#include <fstream>
#include <string>
#include <iterator>
#include <msgpack.hpp>
struct Header
{
std::string s;
MSGPACK_DEFINE(s);
};
struct Data
{
int i, j, k;
MSGPACK_DEFINE(i, j, k);
};
void write()
{
Header h{ "hello world" };
Data d1{ 1,2,3 };
Data d2{ 2,3,4 };
std::fstream out("output.dat", std::ios::out);
msgpack::pack(out, h);
msgpack::pack(out, d1);
msgpack::pack(out, d2);
// amount of data entries is unknown until data stream ends
}
要读回数据,我使用如下读取方法:
void read()
{
std::fstream in("output.dat");
// can i use the fstream directly to read the data?
std::string buffer({ std::istreambuf_iterator<char>(in),
std::istreambuf_iterator<char>() });
msgpack::unpacker unpacker;
unpacker.reserve_buffer(buffer.size());
memcpy(unpacker.buffer(), buffer.data(), buffer.size());
unpacker.buffer_consumed(buffer.size());
msgpack::object_handle oh;
if (unpacker.next(oh))
{
auto header = oh->as<Header>();
while (unpacker.next(oh))
{
auto data = oh->as<Data>();
// ...
}
}
}
现在我的问题是:是否可以像fstream
方法中的msgpack::pack
那样使用输入write
?
如果这不可能,我是否可以直接访问fstream
的char缓冲区和缓冲区大小,而无需复制read
函数中所示的内容?
谢谢。