FlatBuffers:写和从二进制文件中读取?

问题描述 投票:10回答:4

我在C ++和谷歌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);
    }
}

不知道是否进入缓冲区的信息的方式是正确的。例如,该方式获得的数组字段的长度。

对于文件交互(读/写在一个文件中的多个缓冲区)的代码示例将受到欢迎。

c++ serialization fstream binaryfiles flatbuffers
4个回答
3
投票

最好的方式做到这一点,以增加汽车到您的架构该列表:

table Garage {
  cars:[Car];
}

然后你就可以收集多个汽车偏移量(从CreateCar),拨打CreateVector他们,叫CreateGarage上,再喂的是,结果Finish

要阅读,从GetGarage(buffer_pointer)同样开始。


2
投票

我的解决办法是增加额外的尺寸信息。

对于作家::

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);
}

0
投票

快速参考存储缓冲区中的二进制文件。

builder.Finish(mloc);
uint8_t *buf = builder.GetBufferPointer();
int size = builder.GetSize();

std::ofstream ofile("data.bin", std::ios::binary);
ofile.write((char *)buf, size);
ofile.close();

若要从文件中读取:

const std::string inputFile = "data.bin";
std::ifstream infile(inputFile, std::ios_base::binary);
std::vector<char> buffer( std::istreambuf_iterator<char>(infile),
                      std::istreambuf_iterator<char>());

-1
投票

“为文件交互代码示例(读/写在一个文件中的多个缓冲区)将受到欢迎。”

我用FBS和JSON像这样我的测试游戏。 (产生至out_cpp文件夹:gamedata.bin,gamedata.h)

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

我发现这个flatbuffers样品,该样品在第一次非常有用。

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

在我的情况下,git的样品完全不正确,除非你用flatbuffers ::的LoadFile(),而不是提供的样品LOAD_FILE()工作。

© www.soinside.com 2019 - 2024. All rights reserved.