本章首先介绍了一种新的读写文件方式,使用MFC提供的CArchive类来实现。可以利用CArchive类将对象数据保存到永久设备上。这样即使应用程序关闭,再次启动后仍然可以从磁盘上读取对象数据,然后在内存中重构相应的对象。让数据持久性的过程成为串行化或序列化。
CArchive对象不仅可以处理基本类型的数据,还可以处理CObject类的派生对象。CArchive类重载了提取(>>)和插入(<<)操作符。通过这些重载的函数,可以利用CArchive对象完成对文件的读写操作。
CArchive构造函数的声明如下:
1 CArchive( CFile* pFile, UINT nMode, int nBufSize = 4096, void* lpBuf = NULL );
pFile:指向文件对象的指针,该文件对象是持久数据的来源或目的地;
nMode:文件对象的标示符(load,store)读取还是存储;
CArchive类写入数据的实例:
01 void CFileView::OnFileWrite()
02 {
03 CFile file("7.txt",CFile::modeCreate|CFile::modeWrite);
04 CArchive ar(&file,CArchive::store);
05 int i=1;
06 char ch='1';
07 float f=1.3f;
08 CString str="www.colsir.com";
09 ar<<i<<ch<<f<<str;
10 }
完成写入操作之后,用记事本打开7.txt,发现基本上都是乱码。这是因为CArchive对象是一种二进制流。
CArchive类读取数据的实例:
01 void CFileView::OnFileRead()
02 {
03 CFile file("7.txt",CFile::modeRead);
04 CArchive ar(&file,CArchive::load);
05 int i;
06 char ch;
07 float f;
08 CString str;
09 CString strResult;
10 ar>>i>>ch>>f>>str;
11 strResult.Format("%d,%c,%f,%s",i,ch,f,str);
12 MessageBox(strResult);
13 }
对象读取的顺序必须和保存的顺序一致,有些搞不懂,那CArchive类还有什么优势?暂时理解不了。
MFC新建,保存文件时的格式过滤
在字符串表中一个ID为IDR_MAINFRAME的行,用来实现一些初始值的设置。该项的值的优先级低于OnNewDocument函数中的设置。通过查看OnNewDocument函数的申明,可以看到OnNewDocument函数是一个虚函数。
责任编辑:小草