2014-11-06 11 views
7

मुझे सी ++ और Google 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 मैं डॉक्स में इस बारे में कुछ भी नहीं मिल सकता है के लिए। (FlatBufferBuilder के लिए कोई एपीआई संदर्भ नहीं है, और यह मुझे पागल बनाता है।) – masonk

उत्तर

1

अपने स्कीमा के लिए कारों की उस सूची में जोड़ने के लिए यह करने के लिए सबसे अच्छा तरीका है:

table Garage { 
    cars:[Car]; 
} 

तो फिर तुम कई कार ऑफसेट (CreateCar से) एकत्र कर सकते हैं, फोन उन पर CreateVector, उस पर CreateGarage कहते हैं, और उसके बाद Finish के परिणाम खिलाएं।

पढ़ने के लिए, GetGarage(buffer_pointer) से इसी तरह से शुरू करें।

-1

"फ़ाइल इंटरैक्शन के लिए कोड उदाहरण (एक फ़ाइल में एकाधिक बफर लिखना/पढ़ना) स्वागत होगा।"

मैं अपने परीक्षण गेम के लिए इस तरह fbs और json का उपयोग करता हूं। (out_cpp फ़ोल्डर में उत्पन्न: gamedata.bin, gamedata.h)

flatc बी -c -ओ out_cpp gamedata.fbs gamedata.json

और मैं इस नमूने जो काफी है flatbuffers पाया पहली बार उपयोगी।

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

मेरे मामले में, Git नमूना सही ढंग से काम नहीं कर रहा है जब तक आप flatbuffers :: LoadFile() के बजाय नमूना प्रदान की load_file() का उपयोग करें।

+0

रेपो लिंक टूटा हुआ है। –

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); 
} 
संबंधित मुद्दे