FlatBuffers: записывать и читать из двоичного файла?

У меня есть базовые знания о файловых потоков в C ++ и Google FlatBuffers. Файл схемы довольно прост, также создает буфер и читает
из указателя буфера. То, что я не понимаю, как сохранить несколько буферов в двоичный файл, а затем прочитать этот двоичный файл в
получить любой случайный буфер.

Вот простая схема с двумя массивами чисел:

table Car {
field_a:[float];
field_b:[float];
}

.

Функция для построения буфера (хотя и без сохранения файла):

bool save_flatbuf(string file_path, vector<double> vec_a, vector<double> vec_b) {
flatbuffers::FlatBufferBuilder builder;

auto vec_floats_a = builder.CreateVector(vec_a, vec_a.size());
auto vec_floats_b = builder.CreateVector(vec_b, vec_b.size());

auto mloc = CreateCar(builder, &vec_floats_a, &vec_floats_b);

builder.Finish(mloc);

// How to save it into a binary file with a list of "Cars"?
}

.

И функция для чтения буфера после его чтения из двоичного файла (без чтения файла):

bool read_flatbuf(string file_path) {

// How to get the buffer pointer to a "Car" from a binary file with a "list of Cars" ? .

vector<double> final_vec_a;
vector<double> final_vec_b;

auto car = GetCar(buffer_pointer);

auto fa = car->field_a();
auto fb = car->field_b();

final_vec_a.resize(fa->size());
for (int i = 0; i < fa->size(); i++) {
final_vec_a[i] = fa->Get(i);
}

final_vec_b.resize(fb->size());
for (int i = 0; i < fb->size(); i++) {
final_vec_b[i] = fb->Get(i);
}
}

Не уверен, что способ доступа к информации буфера правильный. Например, способ получить длину полей массива.

Примеры кода для взаимодействия с файлами (запись / чтение нескольких буферов в одном файле) приветствуются.

8

Решение

Мое решение — добавить дополнительную информацию о размере.

для писателя ::

for (item : flatbuffer_list) {
int size = item.GetSize();
write (file, &size, sizeof(size));
write (file, item.GetBufferPointer(), item.GetSize());
}

для читателя ::

while(!eof(file)) {
int size;
read (file, &size, sizeof(size));
read (file, buffer, size);
auto item = GetItem(buffer);
}
2

Другие решения

Лучший способ сделать это, чтобы добавить этот список автомобилей в вашу схему:

table Garage {
cars:[Car];
}

Тогда вы можете собрать несколько автомобильных смещений (от CreateCar), вызов CreateVector на них звони CreateGarage на этом, а затем скормить результат этого к Finish,

Чтобы прочитать, начните аналогично с GetGarage(buffer_pointer),

1

«Примеры кода для взаимодействия с файлами (запись / чтение нескольких буферов в одном файле) приветствуются».

Я использую FBS и JSON, как это для моей тестовой игры.
(создать в папке out_cpp: gamedata.bin, gamedata.h)

flatc -b -c -o out_cpp gamedata.fbs gamedata.json

и я нашел этот образец плоских буфера, который довольно полезен в первый раз.

https://github.com/gene-hightower/fb

В моем случае пример git работает неправильно, если вы не используете flatbuffers :: LoadFile () вместо предоставленного примера load_file ().

-1
По вопросам рекламы [email protected]