读取和写入结构的向量到文件

mik*_*e_b 1 c++ fstream vector

我已经阅读了Stack Overflow和其他一些关于向文件写入向量的网站上的一些帖子.我已经实现了我认为有效的方法,但我遇到了一些麻烦.结构中的一个数据成员是类字符串,当重新读入向量时,该数据将丢失.此外,在编写第一次迭代之后,额外的迭代会导致malloc错误.如何修改下面的代码以实现将矢量保存到文件所需的能力,然后在程序再次启动时将其读回?目前,读取是在构造函数中完成的,在析构函数中写入,类的唯一数据成员是向量,但是具有操作该向量的方法.

这是我的读/写方法的要点.假设vector<element> elements......

读:

ifstream infile;
infile.open("data.dat", ios::in | ios::binary);
infile.seekg (0, ios::end);
elements.resize(infile.tellg()/sizeof(element));
infile.seekg (0, ios::beg);
infile.read( (char *) &elements[0], elements.capacity()*sizeof(element));
infile.close();
Run Code Online (Sandbox Code Playgroud)

写:

ofstream outfile;
outfile.open("data.dat", ios::out | ios::binary | ios_base::trunc);
elements.resize(elements.size());
outfile.write( (char *) &elements[0], elements.size() * sizeof(element));
outfile.close();
Run Code Online (Sandbox Code Playgroud)

结构元素:

struct element {
int id;
string test;
int other;        
};
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 6

在C++中,内存通常不能直接像这样直接读写磁盘.特别是,您struct element包含a string,它是非POD数据类型,因此无法直接访问.

思考实验可能有助于澄清这一点.您的代码假定您的所有element值都相同.如果其中一个string test值超出您的假设,会发生什么?您的代码如何知道在读取和写入磁盘时要使用的大小?

您将需要阅读有关序列化的信息,以获取有关如何处理此问题的更多信息.