我正在尝试用C++序列化一组结构.这适用于除我的struct中包含的向量之外的所有数据.我可以将数据写入磁盘,然后将所有数据读回内存.唯一的问题是当我尝试访问向量的元素时,我得到了一个分段错误.我的代码如下.任何帮助是极大的赞赏.
程序写入磁盘
int main {
struct Student one;
strcpy(one.FullName, "Ernestine Waller");
strcpy(one.CompleteAddress, "824 Larson Drv, Silver Spring, MD 20910");
one.Gender = 'F';
one.LivesInASingleParentHome = true;
one.grades.push_back(80);
one.grades.push_back(90);
ofstream ofs("fifthgrade.ros", ios::binary);
ofs.write((char *)&one, sizeof(one));
ofs.close();
}
Run Code Online (Sandbox Code Playgroud)
程序从磁盘读取
int main {
struct Student *two = (struct Student *) malloc(sizeof(struct Student));
ifstream ifs("fifthgrade.ros", ios::binary);
//cout << "Size of struct: " << size << endl;
ifs.read((char *)two, sizeof(struct Student));
cout << "Student Name: " << two->FullName << endl;
cout << "First Grade: " << two->grades[0] << endl;
cout << "Second Grade: " << two->grades[1] << endl;
ifs.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你正在做的是复制你已经存储one并将其写入磁盘的连续内存区域.这适用于简单的数据类型(C++ jargan中的POD).向量的问题是向量是一个复杂的对象,其指针指向其他内存区域.内存这些其他地区是不存在的,当你反序列化one到two,因此您的分段错误.
遗憾的是没有快捷方式,需要编写自定义序列化代码的某些表单才能完成工作.
正如一些人已经提到过Boost Serialization可能有所帮助.或者推出自己的.
序列化一个有可能工作的向量的最简单版本可能是这样的:
your_stream << your_vector.size();
std::copy(your_vector.begin(), your_vector.end(),
std::ostream_iterator<your_vector::value_type>(your_stream, "\n"));
Run Code Online (Sandbox Code Playgroud)
读回来就像:
size_t size;
your_stream >> size;
vector_two.resize(size);
for (size_t i=0; i<size; i++)
your_stream >> vector_two[i];
Run Code Online (Sandbox Code Playgroud)
请注意,这不是特别有效 - 特别是,它(基本上)假设数据将以文本格式存储,这通常相当慢并占用额外的空间(但很容易通过外部读取,操作等)程序,这通常是有用的).
| 归档时间: |
|
| 查看次数: |
8703 次 |
| 最近记录: |