mfc串行化中遇到的问题

在博客园看到了一篇文章:

链接:http://www.cnblogs.com/sobe/archive/2011/03/14/1983778.html

你所知道的MFC序列化

CFile testFile(_T("test.dat"), CFile::modeWrite);
CArchive arSave(&testFile, CArchive::store);
arSave << _T("SoBe") << 6655;
arSave.Close();
testFile.Close();
  
CString str = _T("");
int n = 0;
  
testFile.Open(_T("test.dat"), CFile::modeRead);
CArchive arLoad(&testFile, CArchive::load);
arLoad >> str >> n;
arLoad.Close();
testFile.Close();

先看看这段代码,不知道你有什么感觉呢?

在你还没有动手打开IDE进行调试前,你认为这段代码有没有什么问题?

如果有问题,那又是什么问题呢?

望各位大牛不吝赐教啊~~~

 

 

 

乍一看好像应该没有什么错误,我当时也是这么认为的,并且试验了一下。当然,打开文件的错误我就不说了,应该为

testFile.Open(_T("test.txt"), CFile::modeWrite|CFile::modeCreate|CFile::modeNoTruncate);

但是就算你将代码改正之后,你会发现出现以下的错误。

 

 

    这是一个很诡异的错误,为什么我们写入之后再读取会出现读取时超过文件尾呢?只有一个可能就是我们读取的比我们写入的多。

再仔细看代码会发现,我们写入的其实是一个char的字符串,而读取的是一个CString类型的数据,由CString的继承结构可以知道其继承自CObject是一个可以序列化的对象。对于这些对象,CArchive在写入和读取的时候都会产生一些额外的数据,用来表示对象的类型。由于我们在写入的时候,写入的仅仅是char数据并不是能够serial的对象,所以其被当做基本数据类型来写入,但是读取的时候由于我们读取的是serial对象,所以其会先读取一些额外的信息,以便能够从文件中读取属于该对象的数据用来还原对象。这样我们就能明白为什么会出现超过文件结尾的读取了。

   我记得这些知识好像在哪里看过,翻了一下才知道曾经在侯捷的《深入浅出mfc》中看到过,具体的可能不是很清楚了,看来得重新去看看这本经典的书籍了。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值