1

我在 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());
}

我得到的只是运行时错误。

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

4

2 回答 2

4

如果您不太关心性能,请尝试boost::serialization。由于他们已经为 stl 容器实现了序列化功能,因此您只需为 a 编写序列化功能myCL,其他一切都是免费的。由于您的成员变量都是公开的,您可以以侵入式或非侵入式的方式执行此操作。

于 2012-09-29T15:04:44.720 回答
0

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

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

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

于 2012-09-29T18:07:27.980 回答