2014-11-06 85 views
7

我有C++和谷歌文件流的基本知識。 Schema文件非常簡單,也可以創建緩衝區並從緩衝區指針讀取 。我沒有得到的是如何將多個緩衝區保存到一個二進制文件,然後讀取該二進制文件到 得到任何隨機緩衝區。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); 
    } 
} 

不知道如果訪問該緩衝區的信息的方式是正確的。例如獲取數組字段長度的方法。

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

+1

+1我無法找到有關此內容的文檔任何東西。 (沒有API參考的FlatBufferBuilder,它讓我瘋狂。) – masonk 2015-07-13 19:26:18

回答

1

要做到這一點,以小汽車的列表添加到您的架構的最佳方式:

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

,我發現這個flatbuffers樣品這是相當在第一時間有用。

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

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

+0

回購鏈接已損壞。 – 2017-11-17 12:33:51

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); 
} 
相關問題