我在C ++和谷歌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);
}
}
不知道是否进入缓冲区的信息的方式是正确的。例如,该方式获得的数组字段的长度。
对于文件交互(读/写在一个文件中的多个缓冲区)的代码示例将受到欢迎。
最好的方式做到这一点,以增加汽车到您的架构该列表:
table Garage {
cars:[Car];
}
然后你就可以收集多个汽车偏移量(从CreateCar
),拨打CreateVector
他们,叫CreateGarage
上,再喂的是,结果Finish
。
要阅读,从GetGarage(buffer_pointer)
同样开始。
我的解决办法是增加额外的尺寸信息。
对于作家::
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);
}
快速参考存储缓冲区中的二进制文件。
builder.Finish(mloc);
uint8_t *buf = builder.GetBufferPointer();
int size = builder.GetSize();
std::ofstream ofile("data.bin", std::ios::binary);
ofile.write((char *)buf, size);
ofile.close();
若要从文件中读取:
const std::string inputFile = "data.bin";
std::ifstream infile(inputFile, std::ios_base::binary);
std::vector<char> buffer( std::istreambuf_iterator<char>(infile),
std::istreambuf_iterator<char>());
“为文件交互代码示例(读/写在一个文件中的多个缓冲区)将受到欢迎。”
我用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()工作。