从二进制文件中读取对象列表

Reading list of objects from binary file

我目前正在为一个巨大的数据列表构建一个自定义二进制文件,这些数据将代表游戏中的某个移动角度。虽然我在尝试找到一种方法来写入所有数据点然后将它们读入一个巨大的数组或向量时 运行 撞墙了。

以下是我构建文件格式的方式:

class TestFormat {
    public:
        float   x;
        float   y;
        float   z;
};

以及读写测试代码:

int main()
{
    TestFormat test_1, temp;
    test_1.x = 4.6531;
    test_1.y = 4.7213;
    test_1.z = 6.1375;

    // Write
    ofstream ofs("test.bin", ios::binary);
    ofs.write((char *)&test_1, sizeof(test_1));
    ofs.close();

    // Read
    ifstream ifs("test.bin", ios::binary);
    ifs.read((char *)&temp, sizeof(temp));
    ifs.close();

    cout << temp.x << endl;
}

为了扩展此代码,我可以将其他对象写入同一个文件,但我不确定之后如何将这些对象加载回数组中。

你可以这样做:

  vector<TestFormat> test;
  //....
  // Read
  ifstream ifs("test.bin", ios::binary);
  while(ifs.read((char *)&temp, sizeof(temp))){
     //tmp to array
     test.push_back(TestFormat(temp));
  } 
  ifs.close();

使用 Peter Barmettler 的建议:

ifstream ifs("test.bin", ios::binary);
ifs.seekg(0, std::ios::end);
int fileSize = ifs.tellg();
ifs.seekg(0, std::ios::beg);

vector<TestFormat> test(fileSize/sizeof(TestFormat)); 
ifs.read(reinterpret_cast<char*>(test.data()), fileSize);
ifs.close();

例如,如果你必须输入,你可以这样做:

std::vector<TestFormat> temp(2);

ifstream ifs("test.bin", ios::binary);
ifs.read((char *)temp.data(), temp.size()*sizeof(TestFormat));
ifs.close();

cout << temp[1].x << endl;