第09章MFC的文件处理机制_第1页
第09章MFC的文件处理机制_第2页
第09章MFC的文件处理机制_第3页
第09章MFC的文件处理机制_第4页
第09章MFC的文件处理机制_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第9章章 mfc的文件处理机制的文件处理机制本章主要内容 n序列化(serialization)机制和永久性对象 n对象的序列化和carchive类 ncfile类 9.1 cfile类n在很多时候,程序员希望自己直接编写文件并且直接对文件进行打开、关闭、读、写等操作。mfc把这些对文件的操作封装到了一个叫做cfile的类中,使用这个类的对象能够以更直接的方式来处理文件。 ncfile是mfc文件类的基类,它直接提供非缓冲的二进制磁盘输入/输出设备,并直接地通过派生类支持文本文件和内存文件。磁盘内存中的存储格式转换为文件的格式内存数据把文件的格式恢复为内存中的存储格式9.1.1 cfile类

2、常用成员函数构造cfile对象cfile(lpctstr lpszfilename,uint nopenflags);n构造函数构造一个cfile对象,并打开给定路径的相对应的操作系统文件。nlpszfilename 所需文件的路径字符串,此路径可为相对的也可为绝对的路径。 nopenflags 共享和访问模式,指定当打开文件时进行的动作,可以将以下所列用or(|)操作符联起来。ncfile:modecreate 调用构造函数构造一个新文件,如果文件已存在,则长度变成0。 ncfile:modenotruncate 此值与modecreate组合使用。如果所创建的文件已存在则其长度不变为0。因

3、而此文件被打开,或者作为一个新文件或者作为一个已存在的文件。ncfile:moderead 打开文件仅供读。 ncfile:modereadwrite 打开文件供读写。ncfile:modewrite 打开文件仅供写。ncfile:modenoinherit 阻止文件被子进程继承。ncfile:sharedenynone 不禁止其它进程读或写访问,打开文件。如果文件已被其它进程以兼容模式打开,则create失败。 ncfile:sharedenyread 打开文件,禁止其它进程读此文件。如果文件已被其它进程以兼容模式打开,或被其它进程读,则create失败。ncfile:sharedenywr

4、ite 打开文件,禁止其它进程写此文件。如果文件已被其它进程以兼容模式打开,或被其它进程写,则create失败。ncfile:shareexclusive 以独占模式打开文件,禁止其它进程对文件的读写。如果文件已经以其它模式打开读写(即使被当前进程),则构造失败。ncfile:sharecompat 此标志在32位mfc中无效。此标志在使用cfile:open时映射为cfile:shareexclusive。 ncfile:typetext 对回车换行设置特殊进程(仅用于派生类)。ncfile:typebinary 设置二进制模式(仅用于派生类)。打开文件nvirtual bool open(

5、lpctstr lpszfilename, uint nopenflags, cfileexception* perror = null);n返回值:如果成功打开,则返回非零值,否则为0。perror参数仅在返回0时才有意义。n参数: lpszfilename 待打开文件的路径,路径可为绝对、相对或网络名(unc)。 nopenflags 一个定义了文件的共享和访问模式的uint。它指定了打开文件后的动作,可以用or(|)操作符将选项组合起来,至少应有一个访问权限和一个共享选项, perror 指向一个存在的文件异常对象,获取失败操作的状态。 n/ example for cfile:open

6、cfile f;cfileexception e;char* pfilename = test.dat;if(!f.open(pfilename, cfile:modecreate | cfile:modewrite,&e) #ifdef _debug afxdumpfile could not be openede.m_causen; #endif9.1.2 读文件nvirtual uint read (void* lpbuf,uint ncount);返回值:传输到缓冲区的字节数。注意对所有cfile类,如果到达文件尾,则返回值可能比ncount小。参数: lpbuf 指向用户提供

7、的缓冲区以接收从文件中读取的数据。 ncount 可以从文件中读出的字节数的最大值。对文本模式的文件,回车换行作为一个字符。 说明:从与cfile对象相关联的文件读数据到缓冲区。n示例:/ example for cfile:readextern cfile cfile;char pbuf100;uint nbytesread = cfile.read(pbuf,100); 9.1.3写文件nvirtual void write(const void* lpbuf,uint ncount); throw (cfileexception);参数: lpbuf 指向用户提供的缓冲区,包含将写入文件

8、中的数据。 ncount 从缓冲区内传输的字节数。对文本模式的文件,回车换行作为一个字符。 说明:将数据从缓冲区写入与cfile对象相关联的文件。n示例:/ example for cfile:writeextern cfile cfile;char pbuf100;cfile.write(pbuf,100);9.1.4随机访问一个文件的内容n在打开的文件中重新定位一个指针。n virtual long seek(long loff,uint nfrom); throw(cfileexception);n返回值:如果要求的位置合法,则seek返回从文件开始起的新字节偏移量。否则值未定义并产生c

9、fileexception异常。参数: loff 指针移动的字节数。 nfrom 指针移动的模式,可为以下值之一: cfile:begin 从文件开始,把指针向后移动loff字节。 cfile:current 从当前位置开始,把指针向后移动loff字节。 cfile:end 从文件尾开始,把指针向前移动loff字节。注意必须移动到存在的文件中,因而loff应为负。如果为正值,则超出文件尾。n示例:/ example for cfile:seekextern cfile cfile;long loffset = 1000;long lactual = cfile.seek(loffset, cf

10、ile:begin); cfile:seektobeginnvoid seektobegin( ); 说明:将文件指针指向文件开始处,等价于seek(0l, cfile:begin)。示例:/ example for cfile:seektobeginextern cfile cfile;cfile.seektobegin( ); cfile:seektoendndword seektoend( ); 返回值:文件长度(字节数)。说明:将文件指针指向文件逻辑尾部,等价于cfile:seek( 0l, cfile:end);示例:/ example for cfile:seektoendexte

11、rn cfile cfile;dword dwactual = cfile.seektoend( );9.1.5 cfilefind类-文件查找ncfilefind( );/构造函数。nvirtual bool findfile(lpctstr pstrname = null, dword dwunused = 0);参数: pstrname 指向待找文件名字符串,如果为null,则查找以*.*形式进行。 dwunused 保留,以使findfile在派生类多形,必须为0。nvirtual bool findnextfile( );返回值:如果还有文件,则返回非零值;如果为最后一个文件,则为0

12、。n以下代码将当前目录下的文件枚举出来并打印每个文件名:cfilefind finderbool bworking = finder.findfile(*.*);while(bworking) bworking = finder.findnextfile( ); cout (lpctstr) finder.getfilename( ) endl;9.2 永久性对象与序列化永久性对象与序列化n内存中的对象可以被以文件的形式存储在永久性存储介质中,而当应用程序把它再从永久性存储介质读入后,如果该对象在内存中能恢复为原来的状态,那么这种对象就叫做永久性对象。在面向对象理论中,能使对象成为永久性对象的

13、机制叫做序列化 。(使得数据永久保留的过程就叫作序列化。)磁盘对象在内存中的存储格式转换为文件的格式内存中的对象把文件的格式恢复为内存中的存储格式n所谓永久性对象,就是这种对象具有这样一种能力:它提供了一套描述自身的信息(例如对象的类名称及数据在内存中的存储格式等)。当应用程序存储对象时,应用程序可以把这些信息与对象的数据成员一起打包形成文件,存入永久性存储体,而当再将它读入内存时,根据该文件中提供的信息,可以把数据按原样组织起来,从而把对象原原本本恢复出来。 9.2 永久性对象与序列化永久性对象与序列化n对磁盘进行读写文件的操作是大多数windows应用程序都需要的,为了使每个用mfc编写的

14、windows应用程序能按一个统一的方法实现这个操作,mfc规定必须在serialize函数中来实现向磁盘读写文件的操作。nserialize是cobject类提供的一个虚函数,因此凡是希望具有序列化能力的类,都必须以cobject类或其派生类为基类。n应用程序的数据一般都是由文档对象来管理的,所以在以mfc appwizard创建的文档/视图框架为基础的应用程序运行期间,每当用户新建、打开或保存文档时,程序就会自动调用文档类对象的serialize函数 。 9.2 永久性对象与序列化永久性对象与序列化9.3 对象的序列化对象的序列化ncarchive类类定义了一个代表磁盘文件的cfile类型

15、的指针对象并封装了对文件的打开及关闭等操作方法,同时重载了插入符“”,从而使得carchive类的对象相当于一个特殊的i/o对象,在实际应用中也可以把它看作是磁盘文件的缓冲。 ncarchive允许以一个永久二进制(通常为磁盘存储)的形式保存一个复杂的对象,它可以在对象被删除时,还能永久保存。可以从永久存储中装载对象,在内存中重新构造它们。n可以把一个文档对象看作一种二进制流。象输入/输出流一样,文档与文件有关并允许写缓冲区以及从硬盘读出或读入数据。n必须在创建一个carchive对象之前,创建一个cfile对象。另外,必须确信文档文件的装入/存储与文件的打开模式是兼容的。每一个文件只限于一个

16、活动文档文件。n当构造一个carchive对象时,要把它附加给表示一个打开文件的类cfile(或派生类)的对象上。9.3 对象的序列化对象的序列化n序列化一个对象需要三个要素:序列化一个对象需要三个要素:n一个描述数据文件的一个描述数据文件的cfile对象对象n一个提供序列化上下文的一个提供序列化上下文的carchive对象对象n一个可以被序列化的对象一个可以被序列化的对象构造函数ncarchive(cfile* pfile,uint nmode,int nbufsize=4096,void* lpbuf=null );n参数: pfile cfile对象的指针。cfile对象是永久数据的最终

17、的源或目标。 nmode 标识。它指定了对象是否从文档文件中装载或存储到文件中去。nmode参数必须有下列值之一:carchive:load 从文档文件装载数据。cfile只读。carchive:store 把数据保存到文档文件中。允许cfile写操作。carchive:bnoflushondelete 当文档文件析构程序被调用时,防止文档文件自动调用flush。如果设定了此标识,则在析构程序被调用之前必须负责调用close。如果不这样做,数据就会崩溃。 nbufsize 指定内部文件缓冲区大小的整数,以字节计算。注意缺省的缓冲区大小为4096字节。如果例程文档大的对象,使用大一些的缓冲区,即

18、多个文件缓冲区,那么将会提高例程的执行效率。 lpbuf 指向nbufsize大小的提供缓冲区的指针。如果不指定这个参数,文档文件从本地堆为文档文件分配一个缓冲区并且当对象被毁弃时,释放缓冲区。文档文件不能释放一个提供的缓冲区。 n说明:构造carchive对象并且指定它将用于装载或存储对象。在创建文档文件之后,不能改变这个指定内容。不能使用cfile操作来改变文件的状态直到已经关闭文档文件时。任何这样的操作都将会毁弃文档文件的完整性。n示例:extern char* pfilename;cfile f;char buf512;if(!f.open( pfilename,cfile:modec

19、reate| cfile:modewrite) #ifdef_debug afxdump unable to open file n exit(1); #endifcarchive ar( &f, cachive:strore,512,buf);n书上例9_5在mfc中n使一个类的对象可以是永久性对象,那么在声明这个类的时候必须使用mfc定义的两个宏:declare_serialimplement_serial自定义持久类n 为了使一个类的对象成为持久的,可以自定义一个持久类,将持久性数据的存储和加载的工作交由自定义类自己去完成。这种处理方式也更加符合面向对象的程序设计要求。通过下面几个基本步骤来创建一个能序列化其成员变量的自定义持久类:n 1 直接或间接从cobject类派生出一个新类。 n 2 在类的声明部分包含mfc的declare_serial宏,该宏只需要将类名作为参数。 n 3 重载基类的serialize()函数,并添加对数据成员进行序列化的代码。 n 4 如果构造函数没有一个空的缺省的构造函数(不含任何参数),为其添加一个。 n 5 在类的实现部分,添加mfc的implement_serial宏。该宏需要三个参数:类名,基类名和一个方案号。其中方案号是一个相当于版本号的整数,每当改变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论