2014-11-06 3 views
7

C++ 및 Google FlatBuffers의 파일 스트림에 대한 기본 지식이 있습니다. 스키마 파일은 매우 단순하며 버퍼를 만들고 버퍼 포인터에서 을 읽습니다. 내가 얻지 못하는 것은 여러 개의 버퍼를 바이너리 파일에 저장하는 방법입니다. 그리고 그 바이너리 파일을 읽어서 임의의 버퍼를 얻습니다.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

일에 대한

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

을 ::. (FlatBufferBuilder에 대한 API 참조가 없으므로 나를 미치게 만듭니다.) – masonk

답변

1

스키마에 자동차의 목록을 추가하기 위해이 작업을 수행하는 가장 좋은 방법 :

다음
table Garage { 
    cars:[Car]; 
} 

당신이 (CreateCar에서) 여러 자동차 오프셋 (offset)를 수집 할 수 있습니다, 그들에 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 발견 처음에는 유용했습니다. 당신이 flatbuffers :: LoadFile과 같은 지시어() 대신 샘플 제공 LOAD_FILE()를 사용하지 않는 내 경우

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

는 자식의 샘플이 제대로 작동하지 않습니다.

+0

Repo 링크가 손상되었습니다. –

2

내 솔루션은 추가 크기 정보를 추가하고 있습니다.작가에 대한

은 독자 : 나는 문서에서 이것에 대해 아무것도 찾을 수 없습니다

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