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

时间:2016-04-15 20:31:18

标签: c++ binary iteration ifstream ofstream

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

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

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;
}

要扩展此代码,我可以将其他对象写入同一个文件,但我不知道如何将这些对象加载回数组中。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

  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();

答案 1 :(得分:1)

例如,如果你有条目,你可以这样做:

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;