As others have said: serialization is probably the best solution to your problem.
, - MsgPack. ( ++ 11), , ++ . (, /):
#include <msgpack.hpp>
#include <vector>
#include <string>
struct dataStruct {
int a;
double b, c, d, e, f, g, h, i, j, l, m, n, oo;
MSGPACK_DEFINE(a, b, c, d, e, f, g, h, i, j, l, m, n, oo);
};
int main(void) {
std::vector<dataStruct> vec;
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, vec);
msgpack::unpacked msg;
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
msgpack::object obj = msg.get();
std::vector<dataStruct> rvec;
obj.convert(&rvec);
}
Google FlatBuffers. , .
EDIT. , -: [/p >
#include <msgpack.hpp>
#include <fstream>
#include <iostream>
using std::cout;
using std::endl;
struct dataStruct {
int a;
double b, c, d, e, f, g, h, i, j, l, m, n, oo;
MSGPACK_DEFINE(a, b, c, d, e, f, g, h, i, j, l, m, n, oo);
};
std::ostream& operator<<(std::ostream& out, const dataStruct& ds)
{
out << "[a:" << ds.a << " b:" << ds.b << " ... oo:" << ds.oo << "]";
return out;
}
int main(void) {
{
std::ofstream ofs("log.bin");
dataStruct ds;
ds.a = 1;
ds.b = 1.11;
ds.oo = 101;
msgpack::pack(ofs, ds);
cout << "serialized: " << ds << endl;
ds.a = 2;
ds.b = 2.22;
ds.oo = 202;
msgpack::pack(ofs, ds);
cout << "serialized: " << ds << endl;
}
{
std::ifstream ifs("log.bin");
std::streambuf* pbuf = ifs.rdbuf();
const std::size_t try_read_size = 100;
msgpack::unpacker unp;
dataStruct ds;
while (pbuf->in_avail() > 0) {
unp.reserve_buffer(try_read_size);
std::size_t actual_read_size = ifs.readsome(unp.buffer(), try_read_size);
unp.buffer_consumed(actual_read_size);
msgpack::unpacked result;
while(unp.next(result)) {
msgpack::object obj(result.get());
obj.convert(&ds);
cout << "deserialized: " << ds << endl;
}
}
}
}
:
serialized: [a:1 b:1.11 ... oo:101]
serialized: [a:2 b:2.22 ... oo:202]
deserialized: [a:1 b:1.11 ... oo:101]
deserialized: [a:2 b:2.22 ... oo:202]