这就是我所拥有的:
#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只是任何类型Object的名称。
我做错了什么?如果我得到&#34;对象&#34;矢量大小并将其与&#34; readVector()&#34;进行比较向量大小(在执行程序并第一次保存向量之后)它表明它们具有相同的大小,但是如果我尝试将另一个对象添加到&#34;对象&#34;矢量我得到&#34;分段错误(核心转储)&#34;。有没有更好的方法来保存和读取对象并将它们添加回向量?
答案 0 :(得分:5)
但是,最重要的一点就是你将指针保存到对象中,而不是对象本身。您无法保存先前执行程序的指针,然后在后续程序中使用它们。指针仅在您分配指向的内存和明确delete
它们或程序结束时才有效。
你需要做的是单独保存每个对象 - 指向对象,而不是指针本身 - 然后,一次一个,创建对象,从文件中读取它们,并添加指针他们到了矢量。
或者,您可以将对象直接存储在向量中,而不仅仅是指向它们的指针。
但是,无论哪种方式,如果您的对象不是普通旧数据,这一切都不会起作用,因为否则它们会有像vtable这样的东西,你无法保存。在这种情况下,您需要一种更复杂的序列化方法,而不仅仅是将内存转储到磁盘并将其重新读入。
答案 1 :(得分:0)
首先,编写一个序列化单个对象的函数。这可能是<<
的{{1}}运算符。然后,编写一个std::ostream
循环或for
调用迭代向量并序列化每个对象。将对象本身存储在向量中,而不是指向它们(或者如果您想稍后存储指针或智能指针,可以在std::for_each
循环中取消引用它们。)
简单示例并非您问题的完整答案:
for
您可以使用#include <cstdlib>
#include <iostream>
#include <vector>
using std::cout;
int main(void)
{
std::vector<int> v = {1,2,3};
for ( const int &i : v )
cout << i << std::endl;
return EXIT_SUCCESS;
}
编写二进制数据而不是字符串数据。如果您真的关心跨平台兼容性,那么您首先要转换为指定布局和字节序的标准格式,但您可能不这样做,因此在地址std::ostream::write()
处写sizeof(x)
个字节应该是够好了。这仅适用于普通旧数据类型。