2014-11-06 12 views
7

Posiadam podstawową wiedzę na temat strumieni plików w C++ i Google FlatBuffers. Plik schematu jest dość prosty, tworząc również bufor i odczytując ze wskaźnika bufora. Rzeczą, której nie mam, jest zapisanie wielu buforów w pliku binarnym, a następnie odczytanie tego pliku binarnego do uzyskać dowolny bufor losowy.FlatBuffers: Zapis i odczyt z pliku binarnego?

Oto prosty schemat z dwóch tablic pływaków:

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

.

Funkcja budowania bufora (choć bez zapisywania pliku):

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"? 
} 

.

i funkcją odczytu bufora po to było odczytać z pliku binarnego (bez odczytu pliku):

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

Nie jestem pewien, czy sposób dostępu do informacji bufora jest prawidłowy. Na przykład sposób na uzyskanie długości pól tablicy.

Przykłady kodów interakcji plików (zapis/odczyt wielu buforów w jednym pliku) byłyby mile widziane.

+1

+1 nie mogę znaleźć nic na ten temat w docs. (Nie ma odniesienia do API dla FlatBufferBuilder i doprowadza mnie to do szału.) – masonk

Odpowiedz

1

Najlepszym sposobem, aby to zrobić, aby dodać tę listę samochodów do schematu:

table Garage { 
    cars:[Car]; 
} 

Następnie można zebrać kilka przesunięć samochodowych (z CreateCar), zadzwoń CreateVector na nich, zadzwoń CreateGarage na ten temat, i następnie podaj wynik tego do Finish.

Aby przeczytać, zacznij podobnie od GetGarage(buffer_pointer).

-1

"Przykłady kodu dla interakcji plików (zapis/odczyt wielu buforów w jednym pliku) byłyby mile widziane."

Używam fbs i json w ten sposób do mojej gry testowej. (wygenerować katalogu out_cpp: gamedata.bin, gamedata.h)

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

i znaleziono Ten flatbuffers próbkę, która jest dość przydatne po raz pierwszy.

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

W moim przypadku próbka git nie pracuje poprawnie, chyba że używasz flatbuffers :: loadFile() zamiast próbki umieszczono load_file().

+0

Łącze repo jest zepsute. –

2

Moje rozwiązanie polega na dodaniu dodatkowych informacji o rozmiarze.

dla pisarza ::

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

dla czytelnika ::

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