C++保存对象的问题?

浏览:41日期:2023-05-23

问题描述

//这是测试用的类class A {public: int _i; string _str; vector<int> _vec; A(const int i = 0, const string str = 'hi', vector<int> vec = { 0 }) :_a(i), _b(str), _vec(vec) {}};//这是第一次测试,输出是正确的int main(){ A a(1, 'hello', { 1,2,3 }); ofstream out('test.txt', ios::binary); out.write((char*)&a, sizeof(a)); out.close(); A b; ifstream in('test.txt', ios::binary); in.read((char*)&b, sizeof(b)); in.close(); cout << b._i << b._str << *b._vec.begin(); getchar();}//然后我把写入文件的部分注释掉了,程序就不能用了int main(){ /*A a(1, 'hello', { 1,2,3 }); ofstream out('test.txt', ios::binary); out.write((char*)&a, sizeof(a)); out.close();*/A b; ifstream in('test.txt', ios::binary); in.read((char*)&b, sizeof(b)); in.close(); cout << b._i << b._str << *b._vec.begin(); getchar();}

问题解答

回答1:

只有不带指针的POD可以把整个struct直接写进文件。这就是被垃圾教材坑了啊,当年我们的课本也一样。

回答2:

因为string和vector包含指向堆区的指针。

每次程序运行不一定分配到一个地方。你后面那次读到的是垃圾数据。

你应该想办法保存它的实际数据,找个json库或者什么的。

回答3:

你保存的是对象的引用。栈上数据存了堆上数据没有存。string实现不同可能会导致类对象的大小不一致

A b;ifstream in('test.txt', ios::binary);in.read((char*)&b, sizeof(b));

读出来可能是乱的

回答4:

保存基本数据类型没有问题,string和vector就不行了,要不你自己实现一个,像c那样

相关文章: