11

C++ と Google FlatBuffersのファイル ストリームに関する基本的な知識があります。スキーマ ファイルは非常に単純で、バッファを作成し、バッファ ポインタから読み取ります。私が得られないのは、複数のバッファをバイナリ ファイルに保存し、そのバイナリ ファイルを読み取ってランダム バッファを取得する方法です。

以下は、float の 2 つの配列を持つ単純なスキーマです。

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

バッファの情報にアクセスする方法が正しいかどうかわかりません。たとえば、配列フィールドの長さを取得する方法。

ファイルの相互作用 (1 つのファイルで複数のバッファーの書き込み/読み取り) のコード例は大歓迎です。

4

4 に答える 4

3

私の解決策は、サイズ情報を追加することです。

ライター向け ::

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);
}
于 2016-03-22T08:15:27.647 に答える
-1

「ファイルの相互作用 (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

私の場合、サンプル提供の load_file() の代わりに flatbuffers::LoadFile() を使用しない限り、git サンプルは正しく動作しません。

于 2015-04-12T02:12:44.160 に答える