如何将矢量保存到二进制文件?

0 c++ binaryfiles vector object

这就是我所拥有的:

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

}
Run Code Online (Sandbox Code Playgroud)

ObjectName只是任何类型Object的名称.

我究竟做错了什么?如果我得到"对象"矢量大小并将其与"readVector()"矢量大小进行比较(在执行程序并首次保存矢量后),则表明它们具有相同的大小,但如果我尝试添加"对象"向量的另一个对象我得到"Segmentation fault(core dumped)".有没有更好的方法来保存和读取对象并将它们添加回向量?

小智 5

我担心你在这里遇到很多问题,最后你只需要回到一个好的C++教程并学习语言.在这里,你已经超越了目前对语言的理解.

但是,一个重要的是你要保存指向对象的指针,而不是对象本身.您无法保存先前执行程序的指针,然后在后续程序中使用它们.指针仅在您分配指向的内存以及明确指定delete或程序结束时才有效.

您需要做的是单独保存每个对象 - 指向对象,而不是指针本身 - 然后,一次一个,创建对象,从文件中读取它们,并将指针添加到向量.

或者,您可以将对象直接存储在向量中,而不仅仅是指向它们的指针.

但是,无论哪种方式,如果你的对象不是普通旧数据,这一切都不会起作用,因为否则它们会有像vtable这样你无法保存的东西.在这种情况下,您需要一种更复杂的序列化方法,而不仅仅是将内存转储到磁盘并将其重新读入.