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

时间:2017-03-09 23:06:40

标签: 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只是任何类型Object的名称。

我做错了什么?如果我得到&#34;对象&#34;矢量大小并将其与&#34; readVector()&#34;进行比较向量大小(在执行程序并第一次保存向量之后)它表明它们具有相同的大小,但是如果我尝试将另一个对象添加到&#34;对象&#34;矢量我得到&#34;分段错误(核心转储)&#34;。有没有更好的方法来保存和读取对象并将它们添加回向量?

2 个答案:

答案 0 :(得分:5)

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

但是,最重要的一点就是你将指针保存到对象中,而不是对象本身。您无法保存先前执行程序的指针,然后在后续程序中使用它们。指针仅在您分配指向的内存和明确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)个字节应该是够好了。这仅适用于普通旧数据类型。