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