《第11章 文件编程.ppt》由会员分享,可在线阅读,更多相关《第11章 文件编程.ppt(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第11章 文件编程q文件处理是日常办公最主要的操作,启动一个文件处理软件,如Word、Visual Studio 2005、CAD、Photoshop等,打开相关文件,在软件中读取文件内容,并可显示、编辑,处理完成后,保存修改或另存为另一个文件。在Windows资源管理器里,可以创建、复制、重命名、删除文件,搜索指定目录下的所有文件,获取文件的创建、修改、访问日期,以及文件大小等信息,学习文件编程,可以通过程序操作文件,实现特定功能。11.1 文件类nMFC提供CFile及其他几个类,用于操作文件,如打开、读取、写入、重命名、删除文件等,这些功能能够满足基本需求。若要实现更多的功能,如移动文件
2、、复制文件、设置文件属性等操作,或与目录相关的操作,如创建、删除、设置当前目录,需要调用系统API函数。11.1.1 文件格式n文件格式分为两种:明码格式和暗码格式。明码格式为文本文件,可用记事本或写字板等文字处理程序打开,能看到原始的文件内容,如txt、cpp文件,MFC提供CStdioFile类可以很方便的读取和写入文本文件,CStdioFile类派生自CFile类,在CFile类功能的基础上,新增两个函数用于读写文本。11.1.1 文件格式nReadString函数用于读取一行文本,遇到换行符时停止读取,格式如下:nBOOL CStdioFile:ReadString(CString&r
3、String)n参数:nrString:存放当前行的字符串文本。n返回值:若到文件末尾返回FALSE,否则返回TRUE。11.1.1 文件格式nWriteString函数用于写入文本,可在文本中加入换行符n,格式如下:nvoid CStdioFile:WriteString(LPCTSTR lpsz)n参数:nlpsz:要写入的文本。11.1.2 文件对话框n在日常办公中经常需要打开和保存文件,为统一操作界面,减少重复性开发工作,Windows提供了标准的文件对话框,CFileDialog类封装了文件对话框,提供一系列函数用于操作文件对话框。n【范例11-1】创建一个文件对话框对象,以模态对话
4、框形式显示,显示所有选择文件的路径。11.1.3 文件操作n常用的文件操作有新建、重命名、复制、移动、删除等,以及相关的目录操作。CFile类仅提供新建、重命名、删除文件功能,更多与文件、目录相关的操作,需要调用系统API函数。n【范例11-2】创建一个目录,在目录中创建一个空文件,并执行复制、重命名、移动、删除文件操作。11.1.4 文件状态q硬盘上存放的文件具有一些状态信息,如创建、修改、访问时间,文件大小,文件路径,是否为只读、系统、存档文件,MFC提供CFileStatus结构体用于存放文件状态信息,格式如下:nstruct CFileStatusnnCTime m_ctime;/创建
5、时间nCTime m_mtime;/最后一次修改时间nCTime m_atime;/最后一次访问时间nLONG m_size;/文件大小,以字节为单位nBYTE m_attribute;/属性集合nTCHAR m_szFullName_MAX_PATH;/文件路径n;11.1.4 文件状态nGetStatus函数获取文件的状态信息,静态函数,格式如下:nstatic BOOL CFile:GetStatus(LPCSTR lpszFileName,CFileStatus&rStatus)n参数:nlpszFileName:文件路径。nrStatus:CFileStatus结构体的引用,存放状态
6、信息。n返回值:若成功返回TRUE,否则返回FALSE。11.1.4 文件状态nSetStatus函数用于设置文件的状态信息,也为静态函数,格式如下:nstatic void CFile:SetStatus(LPCTSTR lpszFileName,const CFileStatus&status)n参数:nlpszFileName:文件路径。nstatus:要设置的状态信息。n【范例11-3】获取并显示某个文件的状态信息。11.1.5 读写文本文件n文本文件可用任意文本处理程序打开,与文件的后缀名无关,如dsw、dsp、cpp、h、txt、clw、rc均属于文本文件,可拖放到记事本中打开。M
7、FC提供CStdioFile类专门用于处理文本文件,可以很方便的读取和写入文本,也可使用CFile类读写文本文件,但较为复杂。n【范例11-4】新建一个对话框工程File081,实现读取和写入文本文件。11.1.6 读写二进制文件q二进制文件以0、1形式存储数据,以字节为单位存取,若用记事本打开,显示为乱码字符。每种二进制文件都有其固定的格式,若要读取某种二进制文件,必须先了解其内部格式,如word软件的doc文件,在获取其内部格式前,是无法读取其文件内容的,jpg、bmp等图形文件的内部格式是公开的,可根据内部格式,以字节为单位编程读取、显示。MFC提供CFile类可用于读写二进制文件,相对
8、于文本文件,二进制文件读写较为复杂,但数据保密,且体积较小、读取更快。11.2 文件查找n文件查找是一项常用的电脑操作,随着电脑使用时间增长,硬盘中存放的文件随之增加,使用文件查找功能可以快速找到指定类型的文件,如可以搜索某个目录下的所有word文件,或搜索文件内容中包含“CFileFind”字符串的所有文件。11.3 文件序列化n序列化是一种特殊的文件存取技术,在CFile类的功能基础上,将存取的元素看做是一个个对象,要存储的数据看做数据流,如有对象a、b、c,存储时按照a、b、c的顺序放入数据流中,一次性存入硬盘文件中,读取时按照同样的顺序,将读取的数据依次存入a、b、c中。n序列化技术的
9、关键是创建可序列化的类,任何从CObject派生的类都可重写基类的Serialize函数,在函数内部实现数据成员的序列化存储。使用序列化技术,无需关心数据的实际字节长度,只需用同样的元素顺序执行存取操作,在实际开发中,根据需要决定采用序列化技术还是CFile类直接读取。11.3.1 如何实现序列化nMFC提供CArchive类用于实现序列化技术,该类在CFile类的基础上,实现数据的序列化存储,以简化文件的存取操作。CArchive类不仅可以处理基本数据类型,还可处理支持序列化的类,CObject类提供的基本服务包括支持序列化,可创建一个CObject派生类,并重写Serialize函数,实现
10、类的序列化。n若派生类重写Serialize函数,必须在函数内部先调用基类版本的Serialize函数,同时在类声明中添加DECLARE_SERIAL宏,在类实现文件中添加IMPLEMENT_SERIAL宏,用于添加序列化支持。11.3.2 创建可序列化类n创建一个可序列化类,步骤如下:n(1)新建一个CObject派生类。n(2)添加DECLARE_SERIAL和IMPLEMENT_SERIAL宏。n(3)重写Serialize虚函数。n(4)添加类成员函数。n【范例11-7】新建一个单文档工程名为File084,创建一个可序列化类CMyCircle,在文档类中使用序列化技术存取类对象,在视图类中显示、编辑数据。11.3.3 序列化对象