这是我的:
#include <vector>
#include <fstream>
#include <iostream>
using namespace std;
void saveVector(vector<ObjectName*>);
vector<ObjectName*> readVector();
int main(){
vector<ObjectName*> objects;
int option;
cin >> option;
switch(option){
case 1:{
//read vector
for(int i =0; i < readVector().size(); i++){
objects.push_back(readVector()[i]);
}
break;
}
case 2:{
//save vector
objects.push_back(new ObjectName());
saveVector();
break;
}
return 0;
}
void saveVector(vector<ObjectName*> objects){
ofstream fout("./Binary/ObjectsData.bin", ios::out | ios::binary);
int size1 = objects.size();
fout.write((char*)&size1, sizeof(size1));
fout.write((char*)objects.data(), size1 * sizeof(int));
fout.flush();
fout.close();
}
vector<ObjectName*> readVector(){
vector<ObjectName*> list2;
ifstream is("./Binary/ObjectsData.bin", ios::binary);
int size2;
is.read((char*)&size2, 4);
list2.resize(size2);
is.read((char*)&list2[0], size2 * sizeof(list2));
is.close();
return list2;
}
ObjectName 只是任何类型对象的名称。
我做错了什么?如果我得到“对象” vector 大小并将它与“readVector()” vector 大小进行比较(在执行程序并第一次保存 vector 之后)它表明它们具有相同的大小,但是如果我尝试添加“对象” vector 的另一个对象我得到“段错误(核心转储)”。有没有更好的方法来保存和读取对象并将它们添加回 vector ?
最佳答案
恐怕您在这里有很多问题,最终您将只需要回到一个好的 C++ 教程并学习这门语言。在这里,您已经远远超出了您目前对这门语言的理解。
但是,一个重要的问题是您正在保存对象的指针,而不是对象本身。您不能保存前一次程序执行的指针,然后在后续程序中使用它们。指针仅在您分配它们指向的内存和您显式删除
它们或程序结束之间有效。
您需要做的是单独保存每个对象——指向的对象,而不是指针本身——然后,一次一个地创建对象,从文件中读取它们,并将指针添加到他们到 vector 。
或者,您可以将对象直接存储在 vector 中,而不仅仅是指向它们的指针。
但是,无论哪种方式,如果您的对象不是普通旧数据,这些都将不起作用,因为否则它们将包含您无法保存的 vtables 之类的东西。在这种情况下,您需要一种更复杂的序列化方法,而不仅仅是将内存转储到磁盘并读回。
关于c++ - 如何将 vector 保存到二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42707233/