C ++将类对象矢量向量保存到文件中

时间:2012-09-29 12:11:48

标签: c++ file object vector save

我有一个c ++类,如下所示:

class myCls
{
public:
   myCls();
   void setAngle(float angle);
   void setArr(unsigned char arr[64]);    
   unsigned char arr[64];
   double angle;
   int index;

   static float calcMean(const unsigned char arr[64]);
   static float sqrt7(float x);

};

现在在我的主程序中,我有一个类的3D矢量:

vector<vector<vector< myCls > > > obj;

矢量的大小也是动态变化的。我的问题是如何将我的矢量内容存储到文件中并在之后检索它?

我尝试了许多方法但没有成功。这是我的尝试:

std::ofstream outFile;
outFile.open(fileName, ios::out);
for(int i=0;i<obj.size();i++)
    {
        outFile.write((const char *)(obj.data()),sizeof(vector<vector<myCls> >)*obj.size());
    }
outFile.close();

阅读它:

vector<vector<vector<myCls>>> myObj;
id(inFile.is_open())
{
    inFile.read((char*)(myObj.data()),sizeof(vector<vector<myCls> >)*obj.size());
}

我得到的只是runTime错误。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

如果您不太关心性能,请尝试boost::serialization。由于他们已经为stl容器实现了序列化函数,因此您只需编写myCL的序列化函数,其他所有内容都是免费的。由于您的成员变量都是公开的,因此可以进行干扰或non-intrusively

答案 1 :(得分:0)

在内部,vector通常由两个数字组成,表示当前长度和分配的长度(容量),以及指向实际数据的指针。因此“原始”对象的大小是固定的,大约是指针大小的三倍。这是您的代码当前编写的内容。指针指向的值将不会被存储。当你读回来时,你将指针设置为在大多数情况下甚至不会被分配内存的东西,因此运行时错误。

一般来说,直接操作提供构造函数,析构函数或赋值运算符的任何类的内存是一个非常糟糕的主意。写入vector私有成员的代码会彻底混淆内存管理,即使您已经注意恢复指向的数据也是如此。因此,您应该只按照您的方式编写简单(POD)数据。应该自定义其他所有内容以使用自定义代码。

在向量的情况下,您可能首先存储长度,然后一次写入一个元素。对于读取,您将读取长度,可能相应地保留内存,然后一次读取一个元素。 boost::serialization模板suggested by Voltron可能会为您省去实现所有这些功能的麻烦。