簡體   English   中英

FlatBuffers:寫入和讀取二進制文件?

[英]FlatBuffers: Write to and read from binary file?

我對C ++和Google FlatBuffers中的文件流有基本了解。 Schema文件非常簡單,還可以創建緩沖區並從緩沖區指針讀取。 我沒有得到的是如何將多個緩沖區保存到二進制文件中,然后讀取該二進制文件以獲取任何隨機緩沖區。

這是一個帶有兩個浮點數的簡單Schema:

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

不確定訪問緩沖區信息的方式是否正確。 例如,獲取數組字段長度的方法。

文件交互的代碼示例(在一個文件中寫入/讀取多個緩沖區)將是受歡迎的。

最好的方法是將汽車列表添加到您的架構中:

table Garage {
  cars:[Car];
}

然后你可以收集多個汽車偏移(來自CreateCar ),在它們上面調用CreateVector在其上調用CreateGarage ,然后將結果提供給Finish

要閱讀,請從GetGarage(buffer_pointer)

我的解決方案是添加其他尺寸信息。

作者:::

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

快速參考存儲緩沖區到二進制文件。

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

“歡迎使用文件交互的代碼示例(在一個文件中寫入/讀取多個緩沖區)。”

我在測試游戲中使用這樣的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()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM