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

C++ save vector of vector of vector of class object into file

本文关键字:向量 存到文件 对象 C++      更新时间:2023-10-16

我在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错误。

有人能在这个问题上帮我吗?

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

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

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

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