c++ - 将用户定义的数据类型保存到 C++ 中的文件
问题描述
我有这样的课:
struct SomeClass{
SomeClass(){}
SomeClass(const SomeClass& rhs):
_m1(rhs._m1),
_m2(rhs._m2),
_m3(rhs._m3),
_m4(rhs._m4){}
SomeClass& operator=(const SomeClass& rhs){
// same as above
return *this;
}
int _m1;
std::vector<int> _m2;
std::vector<int> _m3;
int _m4;
};
在我的程序中的某个时刻,我想保存存储在SomeClass
对象中的数据以供以后使用:
SomeClass someObj = arr->getBest(); // arr is a pointer to AnotherClass,
// in which different SomeClass
// objects are initialized and then
// involved in various
// computations in AnotherClass,
// finally the best one SomeClass
// object will be save here
fwrite(&someObj, sizeof(SomeClass), 1, saveFile);
将文件保存到 后saveFile
,我尝试读取它并收到错误:
SomeClass readingSomeObj;
fread(&readingSomeObj, sizeof(SomeClass), 1, savedFile));
编译器投诉“访问冲突读取位置 0x...”。通过观察 VS 中的本地人,我看到 的其他两个字段readingSomeObj
,即_m1
和_m4
在其中有值但没有_m2
和_m3
,在 VS 中它说“无法读取内存”。
它进一步将问题与该问题联系起来SomeClass
,特别是这一行_m2(rhs._m2),
。
但是当我someObj
在行中保存时,fwrite(&someObj, sizeof(SomeClass), 1, saveFile);
我确实看到了这两个成员_m2
并且_m3
有someObj
值(通过将鼠标悬停在 上&someObj
)。
我不知道出了什么问题。我的猜测是构造函数的问题SomeClass
,但仍然是 C++ 的新手,我不知道如何纠正它。在我程序的其他部分,我使用了空的构造函数SomeClass
来初始化AnotherClass
. 但是除了这个保存/阅读部分之外,一切都运行良好。我正在寻找您的慷慨帮助,并感谢一百万!
解决方案
你对你的数据类型做了很多不成立的假设。最令人震惊的是,它的所有字节都存储在内存中的“行”中,彼此相邻,这是逐块复制和读取工作的唯一方式。
这可能适用于 POD(模对齐和字节顺序考虑),但它不适用于复杂的数据类型vector
,例如指向实际存储在其他地方的“真实”数据(通过动态分配)。
您的反序列化向量几乎完全由长期以来无效的指针值组成。
您的序列化例程必须比这更智能。最终没有“单一”的方式来做到这一点。您可以定义自己的格式,也可以使用一些现成的序列化解决方案,这些解决方案已经具有支持标准容器的格式。
你可以谷歌“C++ 类序列化”来获得一些想法。
推荐阅读
- python-3.x - 无法在 pandas 中将 groupby 函数用于数据框
- python-3.x - 在python中随机创建表
- cmake - Cmake 3.1 +“Protobuf_IMPORT_DIRS”导入另一个.proto错误
- node.js - 为什么 CSRF 不能仅在 POST 路由中工作而在其他其他 Post 路由中工作?
- java - 未从 ext 块 build.gradle 解析依赖版本
- c# - itext7 覆盖长字符串值
- javascript - 在NodeJS测试中将值与strictEqual进行比较时,“输入对象相同但引用不相等”?
- nlp - 用于改进推荐系统的多语言自由文本项文本分类
- c - 结构函数指针参数?
- html - CSS 动画淡入/淡出问题