问题描述
//这是测试用的类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那样