在博客园看到了一篇文章:
链接: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》中看到过,具体的可能不是很清楚了,看来得重新去看看这本经典的书籍了。