我对C ++和Google FlatBuffers中的文件流有基本了解。 Schema文件非常简单,还可以创建缓冲区和读取 来自缓冲区指针。我没有得到的是如何将多个缓冲区保存到二进制文件中,然后将该二进制文件读取到 得到任何随机缓冲区。
这是一个带有两个浮点数的简单Schema:
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);
}
}
不确定访问缓冲区信息的方式是否正确。例如,获取数组字段长度的方法。
欢迎使用文件交互的代码示例(在一个文件中写入/读取多个缓冲区)。
答案 0 :(得分:3)
这样做的最佳方法是将汽车列表添加到您的架构中:
table Garage {
cars:[Car];
}
然后,您可以收集多个汽车抵消(来自CreateCar
),致电CreateVector
,致电CreateGarage
,然后将结果提供给Finish
要阅读,请从GetGarage(buffer_pointer)
开始。
答案 1 :(得分:2)
我的解决方案是添加其他尺寸信息。
for writer ::
for (item : flatbuffer_list) {
int size = item.GetSize();
write (file, &size, sizeof(size));
write (file, item.GetBufferPointer(), item.GetSize());
}
for reader ::
while(!eof(file)) {
int size;
read (file, &size, sizeof(size));
read (file, buffer, size);
auto item = GetItem(buffer);
}
答案 2 :(得分:0)
将缓冲区存储到二进制文件的快速参考。
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>());
答案 3 :(得分:-1)
“欢迎使用文件交互的代码示例(在一个文件中写入/读取多个缓冲区)。”
我在测试游戏中使用这样的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()。