2014-11-06 17 views
7

Ho conoscenza di base dei flussi di file in C++ e Google FlatBuffers. Il file Schema è piuttosto semplice, crea anche un buffer e legge da un puntatore del buffer. La cosa che non ottengo è come salvare più buffer in un file binario, quindi leggere il file binario su e ottenere un buffer casuale.FlatBuffers: scrivere e leggere dal file binario?

Ecco un semplice schema di due array di carri:

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

.

Una funzione per costruire il buffer (pur senza il salvataggio del file):

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

.

E una funzione per la lettura del buffer dopo che è stato letto dal file binario (senza la lettura di file):

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

Non sono sicuro se il modo di accedere informazioni del buffer è corretta. Ad esempio il modo per ottenere la lunghezza dei campi dell'array.

Gli esempi di codice per l'interazione tra file (scrittura/lettura di più buffer in un file) sarebbero i benvenuti.

+1

+1 Non riesco a trovare niente di questo nella documentazione. (Non esiste un riferimento API per FlatBufferBuilder, e mi fa impazzire.) – masonk

risposta

1

Il modo migliore per farlo aggiungere che la lista di auto a schema:

table Garage { 
    cars:[Car]; 
} 

Poi si può raccogliere più offset auto (da CreateCar), chiamare CreateVector su di loro, chiamate CreateGarage su questo, e quindi invia il risultato a Finish.

Per leggere, avviare in modo simile da GetGarage(buffer_pointer).

-1

"Gli esempi di codice per l'interazione tra file (scrittura/lettura di più buffer in un file) sarebbero i benvenuti."

Io uso fbs e json come questo per il mio gioco di prova. (generare nella cartella out_cpp: gamedata.bin, gamedata.h)

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

e ho trovato questo flatbuffers campione che è abbastanza utile alla prima volta.

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

Nel mio caso, il campione git non funziona correttamente a meno che non si utilizza flatbuffers :: LoadFile() invece del campione fornito LOAD_FILE().

+0

Il link repo è rotto. –

2

La mia soluzione sta aggiungendo ulteriori informazioni sulle dimensioni.

per lo scrittore ::

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

per il lettore ::

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