2017-03-09 66 views
0

这是我有:如何将矢量保存到二进制文件?

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

} 

对象名只是为任何类型的对象的名称。

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

+0

添加'#include '可能会有所帮助。 – user4581301

+2

保存指向二进制文件的指针没有什么意义。 –

+0

什么是'ObjectName'?和'ObjectType'? – user4581301

回答

5

恐怕你有lot在这里的问题,最终你只需要回到一个很好的C++教程,只是学习语言。在这里,你已经远离目前对语言的理解。

但是,一个很大的问题是,您将指针保存到您的对象,而不是对象本身。您不能保存先前执行的程序的指针,然后在后续的程序中使用它们。指针只在分配它们指向的内存之间有效,以及当它们明确地被delete或程序结束时。

你需要做的是单独保存每个对象—指向的对象,而不是指针本身—然后,一次一个,创建对象,从您的文件中读取它们,并添加指针向他们传播。或者,你可以将对象直接存储在向量中,而不仅仅是指向它们的指针。

但是,无论哪种方式,如果您的对象不是普通旧数据,它们都不会起作用,因为否则它们会在您的对象中包含无法保存的类似vtables的内容。在这种情况下,您需要更复杂的序列化方法,而不仅仅是将内存转出到磁盘并将其读回。

+0

是啊,我刚刚重写了我有错误的代码(我用西班牙语中的变量名)。我的意思是保存包含指向对象的向量的元素,所以我知道我必须对它们进行解引用,但那只是当我想将对象一个接一个存储在二进制文件中。但我想要做的是将包含指向对象的指针的向量保存为二进制文件,这是一个坏主意吗? –

+1

问题是,矢量不包含对象,它包含指向对象的指针。通过保存矢量内容的原始内存,您保存的只是指针,而不是它们指向的对象。 如果你想用一次内存转储保存所有的对象,你需要使用'std :: vector ',它将对象本身存储在向量中,而不是'std :: vector '它只存储指向对象的指针。否则,您必须通过取消引用来一次保存一个对象。 –

+0

好吧,我会尝试并保存对象,而不是指针 –

0

首先编写一个序列化单个对象的函数。这可能是的<<运营商。然后,编写一个for循环或std::for_each调用,该调用在vector上迭代并序列化每个对象。将对象本身存储在向量中,而不是指向它们的指针(或者如果以后要存储指针或智能指针,则可以在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()写入二进制数据,而不是字符串数据。如果你真的关心跨平台兼容性,你首先会转换成指定布局和字节顺序的标准格式,但你可能不需要,所以在地址reinterpret_cast<const char*>(&x)处写sizeof(x)字节应该足够好。这只适用于普通旧数据类型。

+0

感谢您的帮助 –

相关问题