版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第9章章 MFC的文件处理机制的文件处理机制 本章主要内容 n序列化(Serialization)机制和永久性对 象 n对象的序列化和CArchive类 nCFile类 9.1 CFile类 n在很多时候,程序员希望 自己直接编写文件并且直 接对文件进行打开、关闭、 读、写等操作。MFC把这 些对文件的操作封装到了 一个叫做CFile的类中, 使用这个类的对象能够以 更直接的方式来处理文件。 nC文件类的基类,它直接 提供非缓冲的二进制磁盘 输入/输出设备,并直接 地通过派生类支持文本文 件和内存文件。 磁盘 内存中的存储格式转换 为文件的格式 内存数据 把文件的格式恢复为 内存中的存储格式
2、 9.1.1 CFile类常用成员函数 构造CFile对象 C lpsz nOpenFlags); n构造函数构造一个CFile对象,并打开给定路径 的相对应的操作系统文件。 nlpsz 所需文件的路径字符串,此路径可为相对 的也可为绝对的路径。 nOpenFlags 共享和访 问模式,指定当打开文件时进行的动作,可以 将以下所列用OR(|)操作符联起来。 nC 调用构造函数构造一个新文件,如果文件已存在,则长度变成0。 nC 此值与modeCreate组合使用。如果所创建的文件已存在则其长度不变 为0。因而此文件被打开,或者作为一个新文件或者作为一个已存在的文 件。 nC 打开文件仅供读。
3、nC 打开文件供读写。 nC 打开文件仅供写。 nC 阻止文件被子进程继承。 nC 不禁止其它进程读或写访问,打开文件。如果文件已被其它进程以兼容 模式打开,则Create失败。 nC 打开文件,禁止其它进程读此文件。如果文件已被其它进程以兼容模式 打开,或被其它进程读,则Create失败。 nC 打开文件,禁止其它进程写此文件。如果文件已被其它进程以兼容模式 打开,或被其它进程写,则Create失败。 nC 以独占模式打开文件,禁止其它进程对文件的读写。如果文件已经以其 它模式打开读写(即使被当前进程),则构造失败。 nC 此标志在32位MFC中无效。此标志在使用C时映射为C。 nC 对回车
4、换行设置特殊进程(仅用于派生类)。 nC 设置二进制模式(仅用于派生类)。 打开文件 nvirtual BOOL Open(LPCTSTR lpsz, UINT nOpenFlags, C* pError = NULL); n返回值: 如果成功打开,则返回非零值,否则为0。pError参数仅在返回0 时才有意义。 n参数: lpsz 待打开文件的路径,路径可为绝对、相对或网络名 (UNC)。 nOpenFlags 一个定义了文件的共享和访问模式的UINT。 它指定了打开文件后的动作,可以用OR(|)操作符将选项组合 起来,至少应有一个访问权限和一个共享选项, pError 指向一个存在的文件异
5、常对象,获取失败操作的状 态。 n/ example for C CFile f; C e; char* p = test.dat; if(!f.Open(p, C | C) #ifdef _DEBUG afxDump not be openede.m_causen; #endif 9.1.2 读文件 nvirtual UINT Read (void* lpBuf,UINT nCount); 返回值: 传输到缓冲区的字节数。注意对所有CFile类, 如果到达文件尾,则返回值可能比nCount小。 参数: lpBuf 指向用户提供的缓冲区以接收从 文件中读取的数据。 nCount 可以从文件中读
6、 出的字节数的最大值。对文本模式的文件,回 车换行作为一个字符。 说明:从与CFile对象相关联的文件读数据到缓 冲区。 n示例: / example for C extern C; char pbuf100; UINT nBytesRead = c(pbuf,100); 9.1.3写文件 nvirtual void Write(const void* lpBuf,UINT nCount); throw (C); 参数: lpBuf 指向用户提供的缓冲区,包含将 写入文件中的数据。 nCount 从缓冲区内传输 的字节数。对文本模式的文件,回车换行作为 一个字符。 说明: 将数据从缓冲区写入与
7、CFile对象相关联的文件。 n示例: / example for C extern C; char pbuf100; c(pbuf,100); 9.1.4随机访问一个文件的内容 n在打开的文件中重新定位一个指针。 n virtual LONG Seek(LONG lOff,UINT nFrom); throw(C); n 返回值:如果要求的位置合法,则Seek返回从文件开始起 的新字节偏移量。否则值未定义并产生C异常。 参数: lOff 指针移动的字节数。 nFrom 指针移动的模式, 可为以下值之一: C 从文件开始,把指针向后移动lOff字节。 C 从当前位置开始,把指针向后移动lOff
8、字节。 C 从文件尾开始,把指针向前移动lOff字节。注意必须移 动到存在的文件中,因而lOff应为负。如果为正值,则超出 文件尾。 n示例: / example for C extern C; LONG lOffset = 1000; LONG lActual = c(lOffset, C); C nvoid SeekToBegin( ); 说明: 将文件指针指向文件开始处,等价于Seek(0L, C)。 示例: / example for C extern C; c( ); C nDWORD SeekToEnd( ); 返回值:文件长度(字节数)。 说明: 将文件指针指向文件逻辑尾部,等价
9、于C( 0L, C); 示例: / example for C extern C; DWORD dwActual = c( ); 9.1.5 C类-文件查找 nC( );/构造函数。 nvirtual BOOL Find pstrName = NULL, DWORD dwUnused = 0); 参数: pstrName 指向待找文件名字符串,如果 为NULL,则查找以*.*形式进行。 dwUnused 保留,以使FindFile在派生类多 形,必须为0。 nvirtual BOOL FindNextFile( ); 返回值:如果还有文件,则返回非零值;如果为 最后一个文件,则为0。 n以下代
10、码将当前目录下的文件枚举出来并打印 每个文件名: C finder BOOL bWorking = finder.FindFile(*.*); while(bWorking) bWorking = finder.FindNextFile( ); cout (LPCTSTR) finder.Get( ) endl; 9.2 永久性对象与序列化永久性对象与序列化 n内存中的对象可以被以文 件的形式存储在永久性存 储介质中,而当应用程序 把它再从永久性存储介质 读入后,如果该对象在内 存中能恢复为原来的状态, 那么这种对象就叫做永久 性对象。在面向对象理论 中,能使对象成为永久性 对象的机制叫做序列
11、化 。 (使得数据永久保留的过 程就叫作序列化。) 磁盘 对象在内存中的存储格 式转换为文件的格式 内存中的对象 把文件的格式恢复为 内存中的存储格式 n所谓永久性对象,就是这种对象具有这样一种能力: 它提供了一套描述自身的信息(例如对象的类名称及 数据在内存中的存储格式等)。当应用程序存储对象 时,应用程序可以把这些信息与对象的数据成员一起 打包形成文件,存入永久性存储体,而当再将它读入 内存时,根据该文件中提供的信息,可以把数据按原 样组织起来,从而把对象原原本本恢复出来。 9.2 永久性对象与序列化永久性对象与序列化 n对磁盘进行读写文件的操作是大多数Windows应用程 序都需要的,为
12、了使每个用MFC编写的Windows应用 程序能按一个统一的方法实现这个操作,MFC规定必 须在Serialize函数中来实现向磁盘读写文件的操作。 nSerialize是CObject类提供的一个虚函数,因此凡是希 望具有序列化能力的类,都必须以CObject类或其派生 类为基类。 n应用程序的数据一般都是由文档对象来管理的,所以 在以MFC AppWizard创建的文档/视图框架为基础的应 用程序运行期间,每当用户新建、打开或保存文档时, 程序就会自动调用文档类对象的Serialize函数 。 9.2 永久性对象与序列化永久性对象与序列化 9.3 对象的序列化对象的序列化 nCArchiv
13、e类类定义了一个代表磁盘文件的 CFile类型的指针对象并封装了对文件的 打开及关闭等操作方法,同时重载了插 入符“”,从而使得 CArchive类的对象相当于一个特殊的I/O 对象,在实际应用中也可以把它看作是 磁盘文件的缓冲。 nCArchive允许以一个永久二进制(通常为磁盘存储) 的形式保存一个复杂的对象,它可以在对象被删除时, 还能永久保存。可以从永久存储中装载对象,在内存 中重新构造它们。 n可以把一个文档对象看作一种二进制流。象输入/输出 流一样,文档与文件有关并允许写缓冲区以及从硬盘 读出或读入数据。 n必须在创建一个CArchive对象之前,创建一个CFile对 象。另外,必
14、须确信文档文件的装入/存储与文件的打 开模式是兼容的。每一个文件只限于一个活动文档文 件。 n当构造一个CArchive对象时,要把它附加给表示一个 打开文件的类CFile(或派生类)的对象上。 9.3 对象的序列化对象的序列化 n序列化一个对象需要三个要素:序列化一个对象需要三个要素: n一个描述数据文件的一个描述数据文件的cfile对象对象 n一个提供序列化上下文的一个提供序列化上下文的carchive对象对象 n一个可以被序列化的对象一个可以被序列化的对象 构造函数 nCArchive(CFile* p nMode,int nBufSize=4096,void* lpBuf=NULL )
15、; n参数: p对象的指针。CFile对象是永久数据的最终的源或目标。 nMode 标识。它指定了对象是否从文档文件中装载或存储到文件 中去。nMode参数必须有下列值之一: CArchive:load 从文档文件装载数据。CFile只读。 CArchive:store 把数据保存到文档文件中。允许CFile写操作。 CArchive:bNoFlushOnDelete 当文档文件析构程序被调用时,防止文档文 件自动调用Flush。如果设定了此标识,则在析构程序被调用之前必须负 责调用Close。如果不这样做,数据就会崩溃。 nBufSize 指定内部文件缓冲区大小的整数,以字节计算。注意缺 省
16、的缓冲区大小为4096字节。如果例程文档大的对象,使用大一些的缓 冲区,即多个文件缓冲区,那么将会提高例程的执行效率。 lpBuf 指向nBufSize大小的提供缓冲区的指针。如果不指定这个参 数,文档文件从本地堆为文档文件分配一个缓冲区并且当对象被毁弃时, 释放缓冲区。文档文件不能释放一个提供的缓冲区。 n说明: 构造CArchive对象并且指定它将用于装载 或存储对象。在创建文档文件之后,不 能改变这个指定内容。 不能使用CFile操作来改变文件的状态直 到已经关闭文档文件时。任何这样的操 作都将会毁弃文档文件的完整性。 n示例: extern char* p; CFile f; char
17、 buf512; if(!f.Open( p C) #ifdef_DEBUG afxDump Unable to open file n exit(1); #endif CArchive ar( n书上例9_5 在MFC中 n使一个类的对象可以是永久性对象,那 么在声明这个类的时候必须使用MFC定 义的两个宏: DECLARE_SERIAL IMPLEMENT_SERIAL 自定义持久类 n 为了使一个类的对象成为持久的,可以自定义一个持久类, 将持久性数据的存储和加载的工作交由自定义类自己去完成。 这种处理方式也更加符合面向对象的程序设计要求。通过下面 几个基本步骤来创建一个能序列化其成员变
18、量的自定义持久类: n 1 直接或间接从CObject类派生出一个新类。 n 2 在类的声明部分包含MFC的DECLARE_SERIAL宏,该宏 只需要将类名作为参数。 n 3 重载基类的Serialize()函数,并添加对数据成员进行 序列化的代码。 n 4 如果构造函数没有一个空的缺省的构造函数(不含任 何参数),为其添加一个。 n 5 在类的实现部分,添加MFC的IMPLEMENT_SERIAL宏。 该宏需要三个参数:类名,基类名和一个方案号。其中方案 号是一个相当于版本号的整数,每当改变了类的序列化数据 格式后就应当及时更改此数值。 9.3 对象的序列化对象的序列化 9.3 对象的序列化对象的序列化 n在自定义类中要使用序列化函数,具体做: (1)在定义中增加DECLARE_SERIAL宏,在类的执行文件中使用 IMPLEMENT_SERIAL宏如: DECLARE_SERIAL(myclass) IMPLEMENT_SERIAL(myclass,CObject,1) (2)在类中增加成员函数Seri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度“安全生产事故隐患排查”知识竞赛模拟题库及答案详解【有一套】
- 2024-2025学年度法律职业资格考试每日一练试卷附参考答案详解(满分必刷)
- 2024-2025学年反射疗法师大赛理论高分题库完整附答案详解
- 软件开发项目经理训练指南
- 2024-2025学年南京特殊教育师范学院单招《语文》复习提分资料及完整答案详解1套
- 2024-2025学年度电工复习提分资料含完整答案详解(夺冠)
- 2024-2025学年度护士资格证通关题库【培优B卷】附答案详解
- 2024-2025学年广西英华国际职业学院妇产护理期末考试黑钻押题含完整答案详解(名校卷)
- 2024-2025学年度收银审核员试题预测试卷【重点】附答案详解
- 2026中国人寿招聘面试题及答案
- 2025年黑龙江生态工程职业学院单招职业倾向性测试模拟测试卷附答案解析
- 易考优课件教学课件
- 人流室感染控制措施
- 风电项目安全生产实施计划书
- 皮肤型红斑狼疮诊疗指南(2025年)
- 融媒体应聘考试题及答案
- 2025年西安医专选拔面试题库及答案
- 鄂科版二年级全册心理健康教育教案
- 《SBT 11204-2017衣物清洗服务规范》(2026年)实施指南
- 老年2型糖尿病合并认知障碍照护方案
- 高校交通安全课件
评论
0/150
提交评论