|
串行化基础
在介绍串行化之前,首先介绍一下与串行化有关的CArchive类。CArchive类简化了对文件的读写操作,它能够将对象的数据永久的保留到磁盘文件中,并能够从磁盘文件中恢复对象。在CArchive类中重载了C++的<<和>>运算符,其中<<用于将CObject类型或基本类型的数据存储到文件中,>>则从文件中加载CObject或基本类型的数据。下面介绍一下CArchive类的主要方法。 (1)CArchive 该方法是CArchive类的构造函数。 语法: CArchive(CFile* pFile,UINT nMode,int nBufSize = 4096,void* lpBuf = NULL ); 参数说明: pFile:表示文件对象指针,对象的数据将存储在该文件中。 nMode:表示对象是加载数据还是保存数据。为CArchive::load,表示从存档对象中加载数据。为CArchive::store,表示存储对象到存档对象中。为CArchive::bNoFlushOnDelete,表示禁止存档对象在释放时自动调用Flush方法。 nBufSize:表示内部文件缓冲区大小,默认为4096个字节。 lpBuf:表示一个可选的指针,执行用户提供的nBufSize大小的缓冲区。如果未指定该参数,存档对象从应用程序的局部堆中分配缓冲区,并且在对象释放时释放缓冲区。如果用户指定了该缓冲区,在对象释放后需要手动释放该缓冲区。 (2)Read 该方法用于从存档对象中读取数据。 语法: UINT Read(void* lpBuf,UINT nMax); 参数说明: lpBuf:表示接收数据的缓冲区。 nMax:以字节为单位表示读取数据的大小。 (3)Write 该方法向存档对象中写入数据。 语法: void Write(const void* lpBuf,UINT nMax); 参数说明: lpBuf:表示写入数据的缓冲区。 nMax:以字节为单位表示写入数据的大小。 (4)IsLoading 该方法确定存档对象是否被加载数据。 语法: BOOL IsLoading( ) const; (5)IsStoring 该方法确定存档对象是否存储数据。 语法: BOOL IsStoring( ) const; 下面通过一个示例来演示如何使用CArchive类读写文件。 例如,使用CArchive类读写文件 (1)创建一个基于对话框的工程,工程名称为“RWFile”。 (2)处理“写入”按钮的单击事件,向文件中写入数据。 void CRWFileDlg::OnWrite() { CFile file("demo.txt",CFile::modeCreate|CFile::modeWrite); //定义一个文件对象,并创建文件 CArchive ar(&file,CArchive::store); //定义一个存档对象 int idata = 100; //定义整型变量 char chdata = 'M'; //定义字符变量 double fdata = 50.45; //定义实型变量 CString strInfo = "明天会更好"; //定义字符串变量 ar<<idata<<chdata<<fdata<<strInfo; //写入数据 } (3)处理“读取”按钮的单击事件,从文件中读取数据。 void CRWFileDlg::OnRead() { CFile file("demo.txt",CFile::modeRead); //定义文件对象,读取文件 CArchive ar(&file,CArchive::load); //定义存档对象,加载文件 int idata; //定义整型变量 char chdata; //定义字符变量 double fdata; //定义实型变量 CString strInfo; //定义字符串变量 ar>>idata>>chdata>>fdata>>strInfo; //读取数据 CString strText; //定义字符变量 strText.Format("%d,%c,%f,%s",idata,chdata,fdata,strInfo); //格式化字符串 MessageBox(strText,"提示"); //弹出对话框 } (4)运行程序,效果如图1所示。 ![]() 图1 CArchive类读写文件 |