直接从std :: fstream读取

时间:2019-07-09 13:52:17

标签: c++ msgpack

我尝试使用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函数中所示的内容?

谢谢。

0 个答案:

没有答案