当前位置: 首页 > news >正文

网站建设吉金手指专业12网站建设培训哪里好

网站建设吉金手指专业12,网站建设培训哪里好,软件外包平台哪家好,视频制作gif表情包目录 文件操作相关类 序列化机制相关类 序列化机制使用 序列化机制执行过程 序列化类对象 文件操作相关类 CFile#xff1a;文件操作类#xff0c;封装了关于文件读写等操作#xff0c;常见的方法#xff1a; CFile::Open#xff1a;打开或者创建文件CFile::Write/…目录 文件操作相关类 序列化机制相关类 序列化机制使用 序列化机制执行过程 序列化类对象 文件操作相关类 CFile文件操作类封装了关于文件读写等操作常见的方法 CFile::Open打开或者创建文件CFile::Write/Read写/读文件CFile::Close关闭文件CFile::SeekToBegin/SeekToEnd/Seek从 开始/结束/任意 位置设置文件读写位置 代码如下 #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; } 序列化机制相关类 序列化作用以二进制流形式读写硬盘文件效率很高。 CFile文件操作类完成硬盘文件的读写操作CArchive归档类完成内存数据的读写操作维护了一个缓冲区 先把数据放到缓冲区再放到硬盘上 序列化机制使用 序列化往硬盘上写数据 创建或打开文件  CFile::Open定义归档类对象  CArchive ar数据序列化(存储/写)  ar数据   把数据读入缓冲区关闭归档类对象释放缓冲区关闭文件 反序列化从硬盘上读取数据。 打开文件  CFile::Open定义归档类  CArchive  ar;数据反序列化(加载/读)  ar变量关闭文档类对象   ar.close()关闭文件    CFile::Close() 代码如下 #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; } 问题数据一共16字节为啥是17个字节 原因首先排除\0如果在内存中会有这个符号但是再硬盘不会有。多出的一个字节是描述字符串大小的。前四个字节是Int后四个字节是float中间一个字节是字符串长度为8 Windows记事本解析文件是按照字符解析所以前面的数字乱码了。 序列化机制执行过程 数据结构 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; // 开始指向 } CArchive ar(file, CArchive::store, 4096);  构造函数伪代码如下 CFile file; file.Open( E:/MFC/Day07/serial.txt, CFile::modeCreate | CFile::modeWrite ); CArchive ar(file, CArchive::store, 4096) CArchive::CArchive(file0 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); } // 把18存入缓冲区并且指针后移4个字节float score 88.5; ar score CArchive::operator(score)//函数内部this为ar {if (m_lpBufCur sizeof(float) m_lpBufMax) {Flush();}*m_lpBufCur score;//88.5 m_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;//重置当前指向} } 如何需要写入4个字节但是只剩3个字节的空间怎么办 会调用flush()把缓冲区的数据写入到硬盘空间再重置当前指针指向。再重新写入数据相当于从头覆盖写入。 序列化执行过程总结 ar对象维护一个缓冲区将各个数据依次序列化(存储)到ar对象维护的缓冲区中并将m_lpBufCur的指针指向移动相应字节如果ar维护的缓冲区不足则将ar维护的缓冲区的数据写入硬盘文件并重置m_lpBufCur为开始指向当关闭ar对象时将ar对象维护的缓冲区数据写入硬盘文件并释放ar对象维护的缓冲区。 反序列化执行过程总结 ar对象维护一个缓冲区当反序列化第一个数据时将文件数据全部读取到ar维护的缓冲区并将第一个数据反序列化到第一个变量并将m_lpBufCur移动相应的字节数依次反序列化每个数据到变量中当关闭ar对象时释放ar维护的缓冲区 序列化类对象 序列化类对象的使用 类必须派生自CObject类内必须添加声明宏  DECLARE_SERIAL(theClass)类外必须添加实现宏   IMPLEMENT_SERIAL(theClass,baseClass,1)类必须重写虚函数 Serialize 当类具备以上四个条件时类对象就可以序列化到文件保存了。 序列化类对象除了要把类对象成员变量还有类对象的信息类对象大小和版本等。 完整测试代码如下 #include afxwin.h #include iostream using namespace std;class CMyDoc : public CDocument{DECLARE_SERIAL( CMyDoc ) public:CMyDoc(int age0, float score0.0, CString name):m_age(age),m_score(score),m_name(name){}int m_age;float m_score;CString m_name;virtual void Serialize( CArchive ar ); }; IMPLEMENT_SERIAL( CMyDoc, CDocument, 1 ) void CMyDoc::Serialize( CArchive ar ){if( ar.IsStoring() ){ar this-m_age this-m_score this-m_name; //序列化基本类型变量 }else{ar m_age m_score m_name;//反序列化基本类型变量} } void Store( ){//序列化存储、写数据CFile file;file.Open(E:/MFC/Day08/serial.txt, CFile::modeCreate|CFile::modeWrite);CArchive ar(file, CArchive::store, 4096);//归档类对象,维护缓冲区。CMyDoc data(18, 88.5, zhangsan);ar data; //序列化对象就是将对象的各个成员变量序列化。ar.Close( );file.Close( ); } void Load( ){//反序列化加载/读CFile file;file.Open( E:/MFC/day08/serial.txt, CFile::modeRead );CArchive ar( file, CArchive::load, 4096 );//维护一个buff大小4096字节CMyDoc* pdata NULL;ar pdata;ar.Close( );file.Close( );cout pdata-m_age pdata-m_score pdata-m_name endl; } int main(){Store( );Load( );return 0; } 测试结果CMyDoc后面是成员变量的数据前面是类对象信息 把 DECLARE_SERIAL( CMyDoc ) 宏展开 再进一步展开宏  _DECLARE_DYNCREATE 更进一步进入 _DECLARE_DYNAMIC 所以可以认为就是动态创建机制宏 实现宏展开 相当于动态创建机制加上一个操作符重载 下断点分析一下类对象序列化执行 伪代码如下 CFile file; file.Open(E:/MFC/Day08/serial.txt, CFile::modeCreate|CFile::modeWrite); CArchive ar(file, CArchive::store, 4096);//归档类对象,维护缓冲区。 CMyDoc data(18, 88.5, zhangsan); ar data operator(ar, const data) {ar.WriteObject(data)//函数内部this为ar{CRuntimeClass* pClassRef data-GetRuntimeClass();//文档类静态变量WriteClass(pClassRef);//将类的相关信息类名/类大小/类版本存入ar维护的buff中(data)-Serialize(ar)//函数内部this为data{ar this-m_age this-m_score this-m_name; //序列化基本类型变量}} }CFile file; file.Open( E:/MFC/day08/serial.txt, CFile::modeRead ); CArchive ar( file, CArchive::load, 4096 );//维护一个buff大小4096字节 CMyDoc* pdata NULL;//???????????? ar pdata operator(ar, pdata) {pdata ar.ReadObject(RUNTIME_CLASS(CMyDoc))//函数内部this为ar{CRuntimeClass* pClassRef ReadClass(RUNTIME_CLASS(CMyDoc),...);//从文件读取 类的相关信息和 RUNTIME_CLASS(CMyDoc)中信息进行比对//如果相同返回RUNTIME_CLASS(CMyDoc),如果不同返回NULLCObject*pOb RUNTIME_CLASS(CMyDoc)-CreateObject();//动态创建CMyDoc类的对象并返回对象地址pOb-Serialize(ar)//函数内部this为刚刚创建的CMyDoc类对象pOb{ar m_age m_score m_name;//反序列化基本类型变量}return pOb;} }
http://www.pierceye.com/news/404832/

相关文章:

  • 企业网站的综合要求最新领导班子7人名单
  • 通过阿里云建设企业网站联想企业网站建设的思路
  • 网站建设服务器的选择方案建设报名系统是正规网站吗
  • 揭阳高端模板建站WordPress背景音乐6
  • 如何使用云服务建设网站cpa之家 app推广平台
  • 网站设计策划书案例漳浦建设局网站
  • ps做分享类网站效果图设计公司工作室创业规划
  • 个人虚拟机做网站设计实例网站
  • 衡阳企业网站wordpress置顶文章顺序
  • 网站建设宗旨是指郑州有名的做网页的公司
  • 怎么0成本做网站企业网站如何设计网页
  • 做韦恩图网站课程分销平台
  • html5网站建设中企业整站推广
  • 织梦网站打开速度慢做抢单软件的网站
  • 51单片机可以做网站怎么建设游戏试玩平台网站
  • 汕头网站建设方案维护wordpress百度熊掌
  • 牛街网站建设产品vi设计都包括什么
  • 网站需要多大宽带网站发展的方向
  • 陈光锋网站运营推广新动向故城建设银行网站
  • 备案后网站可以改名吗临颖网站建设
  • 临沭县建设局官方网站怎样做外贸网站推广
  • 手机网站支付一个简单的网页代码带图片
  • 向公司申请请做网站广州网站推广教程
  • 用QQ群做网站排名交互式网站app
  • 正规免费发布信息网站国外网站界面
  • 浏览国外网站 dns网店运营推广方案
  • wordpress弹幕视频插件广西seo搜索引擎优化
  • 网站开发与维护工资多少网络公司排名兴田德润
  • wordpress主题ux壹搜网站建设优化排名
  • 试剂产品商城网站建设杭州网站现场备案