c++ - 如何将 vector 保存到二进制文件?

标签 c++ object vector binaryfiles

这是我的:

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

相关文章:

c++ - 多态(纯抽象)映射键牺牲类型安全?

javascript - 如何让 C++ 参数决定网页的 HTML 外观?

c++ - 无法使用 std::for_each() 和 std::bind() 过滤 vector 中的元素并将这些过滤后的元素放入新 vector 中

object - 如何在powershell中获取对象属性的名称?

c++ - 删除类内部成员函数中的对象

list - Clojure 函数抛出空指针异常

c++ - 使用 find_if() 函数

c++ - 为什么 std::vector::resize(n, src) 按值传递?

c++ - 在 C++ 中,自定义头文件是可选的吗?

python - 新手 Django 选择菜单 'function' 对象不可迭代