Читайте прямо из std :: fstream - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь сериализовать поток данных в файл, используя 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 s, не копируя его содержимое, как показано в read функция?

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...