MFC 学习笔记( 十 )

七、序列化机制:文件序列化与反序列化:文件操作相关类:

MFC 学习笔记

文章插图
代码 :
#include <afxwin.h>#include <iostream>using namespace std;void File( ){ CFile file; file.Open( "E:/MFC/Day07/file.txt", CFile::modeCreate|CFile::modeReadWrite ); char str[] = "hello file"; file.Write( str, strlen(str) ); file.SeekToBegin( ); char buf[256] = { 0 }; long nLen = file.Read( buf, 255 ); cout << buf << ' ' << nLen << endl; file.Close( );}int main(){ File( ); return 0;}
MFC 学习笔记

文章插图
序列化机制使用:
MFC 学习笔记

文章插图
反序列化机制使用:
MFC 学习笔记

文章插图
代码:
#include <afxwin.h>#include <iostream>using namespace std;void Store( ){//序列化(存储、写)数据 CFile file; file.Open( "E:/MFC/Day07/serial.txt", CFile::modeCreate | CFile::modeWrite ); CArchive ar(&file, CArchive::store, 4096);//归档类对象,维护缓冲区 。long age = 18; ar << age;//将18保存当前指向的位置,并向后移动当前指向,相应字节数 。float score = 88.5; ar << score;//将88.5保存当前指向的位置,并向后移动当前指向,相应字节数 。CString name = "zhangsan"; ar << name; ar.Close( ); file.Close( );}void Load( ){//反序列化(加载/读) CFile file; file.Open( "E:/MFC/day07/serial.txt", CFile::modeRead ); CArchive ar( &file, CArchive::load, 4096 );//维护一个buff,大小4096字节 long age; ar >> age;//当反序列化第一个数据时候,内部将文件中所有数据读入ar维护的buff中 float score; ar >> score;//当反序列化后续数据时候,不需要到硬盘文件中读取,直接到ar维护的buff中读取 CString name; ar >> name;//当反序列化后续数据时候,不需要到硬盘文件中读取,直接到ar维护的buff中读取 ar.Close( ); file.Close( ); cout << age << ' ' << score << ' ' << name << endl;}int main(){ Store( ); Load( ); return 0;}执行过程:
MFC 学习笔记

文章插图
序列化过程:
MFC 学习笔记

文章插图
伪代码:
class CArchive{enum Mode { store = 0, load = 1…}; BOOL m_nMode;//访问方式 int m_nBufSize;//buff的大小 CFile* m_pFile;//操作的文件对象 BYTE* m_lpBufCur;//当前指向 BYTE* m_lpBufMax;//终止指向 BYTE* m_lpBufStart;//开始指向 ….}CFile file;file.Open( "E:/MFC/Day07/serial.txt", CFile::modeCreate | CFile::modeWrite );CArchive ar(&file, CArchive::store, 4096) === CArchive::CArchive(&file,0, 4096){m_nMode = CArchive::store; // 0m_pFile = &file;//“E:/....serial.txt”m_nBufSize = 4096;m_lpBufStart = new BYTE[m_nBufSize];m_lpBufMax = m_lpBufStart + 4096;m_lpBufCur =m_lpBufStart;}long age = 18;ar << age === CArchive::operator<<(age)//函数内部this为&ar{if (m_lpBufCur + sizeof(LONG) > m_lpBufMax){Flush();}*m_lpBufCur = age;m_lpBufCur += sizeof(LONG);}float score = 88.5;ar << score === CArchive::operator<<(score)//函数内部this为&ar{if (m_lpBufCur + sizeof(float) > m_lpBufMax){Flush();}*m_lpBufCur = score;//88.5m_lpBufCur += sizeof(float);}CString name = "zhangsan";ar << name === CArchive::operator<<(name)//函数内部this为&ar{AfxWriteStringLength(ar, 8 ){ar<<(unsigned char)nLength;//8}Write(name, 8)//函数内部this为&ar{memcpy_s(m_lpBufCur, (size_t)(m_lpBufMax - m_lpBufCur), name, 8);m_lpBufCur += 8;}}ar.Close( )//函数内部this为&ar{Flush()//函数内部this为&ar{&file->Write(m_lpBufStart, ULONG(m_lpBufCur - m_lpBufStart));m_lpBufCur = m_lpBufStart;//重置当前指向}}m_lpBufCur 18 88.5 8 zhangsan||--------------------------------------------------------------------|||m_lpBufStartm_lpBufMax

经验总结扩展阅读