我目前正在为庞大的数据列表构建自定义二进制文件,这些数据将代表游戏中的某些角度。虽然我试图找到一种方法来编写所有数据点,然后将它们读入一个巨大的数组或向量中,但我遇到了问题。
以下是我构建文件格式的方法:
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;
}
要扩展此代码,我可以将其他对象写入同一个文件,但我不知道如何将这些对象加载回数组中。
答案 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;