版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、V c+ 编程技术,授课对象:(本科) 教 师: 廖光忠,第六讲文档类对象的持续性及其文档视图结构的高级形式,目标: 学习使用文件访问和文档类 内容: 访问二进制文件 访问标准I/O文件 访问内存文件 在数据类中实现串行化 串行化SDI或MDI文档 例子;,访问二进制文件,目标 在一个平面磁盘文件中维护二进制数据。 策略 利用M F C的C F i l e类,该类封装了Windows API中处理二进制文件的函数。 步骤 1. 检查文件是否存在 要判断某个文件是否已在磁盘上存在,可以使用静态C F i l e函数GetStatus( )。 CFileStatus status; if (!CF
2、ile:GetStatus(sFile,status) msg.Format(%s does not exist,sFile); A f x M e s s a g e B o x ( m s g ) ; ,2. 创建一个二进制文件 为了创建一个可写的二进制文件,首先创建一个C F i l e类对象,然后利用Open( )成员函数打开并创建一个文件对象。 CFile file; CString msg; CString sFile(Wzd.tmp); if (!file.Open(sFile, CFile:modeCreate|CFile:modeWr i t e ) ) msg.Format
3、(Failed to create %s.,sFile); A f x M e s s a g e B o x ( m s g ) ; ,3. 使用二进制文件 1) 写二进制数据到文件中。 f i l e . Write (buff e r, sizeof (buff e r ) ) ; 2) 关闭文件,销毁文件对象。 file. Close( ); 3) 打开一个二进制文件进行读操作。 if (!file.Open(sFile, CFile:modeRead) msg.Format(Failed to open %s.,sFile); A f x M e s s a g e B o x (
4、m s g ) ; 4) 获得二进制或其他类型文件的长度。 UINT nBytes = file.GetLength( ); 5) 使用如下函数之一以改变文件读写的当前位置。 f i l e . S e e k To E n d ( ) ; file.Seek(20, / file offset in bytes CFile:begin); / also CFile:end and CFile:current f i l e . S e e k To B e g i n ( ),6) 利用如下代码从二进制文件中读取数据,其中n B y t e s是实际读取的字节数。若n B y t e s比想
5、要读取的字节数小或者为0,则已到文件结束处。 nBytes = file.Read (buff e r, sizeof (buff e r ) ); 7) 设置文件为只读,使用C F i l e的静态成员函数SetStatus( )。我们获取文件当前的任何状态,并加上只读状态标记。 if (CFile:GetStatus(sFile, status) s t a t u s . m _ a t t r i b u t e | = 0 x 0 1 ; CFile:SetStatus(sFile, status); 8) 删除一个文件,使用C F i l e的另外一个静态函数Remove( )。
6、CFile:Remove (sFile);,访问标准I/O文件,目标 操作文本文件。 策略 利用M F C的C S t d i o F i l e类操作文本文件。C S t d i o F i l e从C F i l e类派生,并封装Windows API中用来处理文本文件的函数。,步骤 1. 检查一个文件是否存在 使用C F i l e类的GetStatus( )静态函数,判断一个文本文件是否存在。 CFileStatus status; CString sFile(Wzd.txt); if (!CFile:GetStatus(sFile,status) msg.Format(%s does
7、 not exist,sFile); A f x M e s s a g e B o x ( m s g ) ; 2. 创建一个文本文件 打开一个文本文件以写文本串。本例中,若所找文件无法打开,则创建一个新文件。 CStdioFile file; if(!file.Open(sFile, CFile:modeWrite | CFile:typeTe x t ) ) if(!file.Open(sFile, CFile:modeCreate | C F i l e : : m o d e Write | CFile:typeTe x t ) ) CString msg; msg.Format(F
8、ailed to create %s.,sFile); ,3. 使用文本文件 1) 写一个文本串到文件中。 f i l e . WriteString (sRecord); 2) 关闭文件并销毁创建的文件对象。 file.Close( ); 3) 打开一个文本文件进行读操作。 if (!file.Open(sFile, CFile:modeRead | CFile:typeTe x t ) ) msg.Format(Failed to open %s.,sFile); A f x M e s s a g e B o x ( m s g ) ; 4) 定位到文件的头和尾。 f i l e . S
9、 e e k ToEnd( ); f i l e . S e e k ToBegin( ); 5) 从一个文本文件中读一个文本串。 file.ReadString (sRecord); 6) 删除一个文本文件。 CFile: Remove (sFile);,访问内存文件,目标 在内存中生成一个文件,而不是在磁盘上生成一个临时文件。 策略使用M F C的C M e m F i l e类,该类是从C F i l e类派生的,封装分配内存的Windows API。 步骤 1. 创建一个内存文件 要创始一个内存文件,只要创建一个C M e m F i l e类对象。 CMemFile file; 创建
10、一个C M e m F i l e类对象自动打开一个内存文件。 2. 使用内存文件 1) 写内存文件。 f i l e . Write (buff e r, sizeof (buff e r ) ) ;,2) 判断内存文件的当前长度。 UINT nBytes = file.GetLength( ); 3) 使用以下方法定位下次读写的位置。 f i l e . S e e k To E n d ( ) ; file.Seek(20, / file offset in bytes CFile:begin); / also CFile:end and CFile:current f i l e .
11、S e e k To B e g i n ( ) ; 4) 从内存文件中读数据。 nBytes = file.Read (buff e r, sizeof (buff e r ) ) ; 5) 删除内存文件有两种方法:一是销毁C M e m F i l e类对象,二是设置文件长度为0。 file.SetLength (0);,在数据类中实现串行化,目标 串行化数据类。 策略 实现从C O b j c t派生过来的数据类的串行化。M F C的C O b j e c t类添加一个虚重载函数到类中,该函数为Serialize( )。我们将用我们自己的Serialize( )重载这个Serialize
12、( ),使之装入和保存成员变量到磁盘上。,步骤 1. 在数据类中加入Serialize( ) 从M F C的C O b j e c t派生得到用户的数据类。不是从C O b j e c t派生的类不能进行串行化。因为C l a s s Wi z a r d没有提供把C O b j e c t作为类的基类的功能,则需要加进这个基类。 class CMyData : public CObject ; 利用以下格式,在每个数据类中加入Serialize( )成员函数。 void CMyData:Serialize(CArchive i f ( a r. I s S t o r i n g ( ) )
13、 / store data e l s e / load data ,2. 串行化简单变量 1) 要保存数据类中不是从C O b j e c t派生的成员变量,在Serialize( )函数的“保存数据”区使用 重载操作符。 C O b j e c t : : S e r i a l i z e ( a r ) ; i f ( a r. I s S t o r i n g ( ) ) / store data e l s e / load member variables not derived from CObject ar m_sName; ar m_sComment; ,3. 串行化派生
14、于C O b j e c t的变量 调用成员变量的Serialize( )函数以保存派生于C O b j e c t的成员变量。 / load and store member variables derived from CObject m _ w z d I n f o . S e r i a l i z e ( a r ) ; 可以在类的Serialize( )函数的调出和保存区中,调用该Serialize( )函数,或者在if else 表达式之后调用该Serialize( )一次即可。若在变量类中没有实现Serialize( ),则应该加上一个。,4. 串行化数据集 1) 保存数据集
15、,使用如下语句。 nCount = m_WzdInfoList.GetCount(); / get number of items in ar S e r i a l i z e ( a r ) ; 注意在这里我们首先保存数据集中工程的数目,然后一步一步地按顺序保存每个工程。 2) 使用如下语句,装入数据集。 / load a list of data ar nCount; while (nCount- 0) CWzdInfo2* pInfo = new CWzdInfo2; p I n f o - S e r i a l i z e ( a r ) ; m _ W z d I n f o L
16、 i s t . A d d Ta i l ( p I n f o ) ; ,串行化SDI或MDI文档,目标 利用M F C框架的内建特征串行化S D I和M D I文档到磁盘。 策略 利用文档类中的两个函数实现从磁盘中调出文档或串行化文档到磁盘上。第一个是文档类的Serialize( )函数,通过对它编程,系统地调用文档中每个数据类实例的Serialize( )成员函数(在前例中,我们已经添加了该成员函数)。第二个是DeleteContents( ),用来初始化文档。 我们还将编辑一段代码来定制打开文件对话框的文档扩展名。,步骤 1. 使用文档类的Serialize( ) 定位D o c u
17、 m e n t类的Serialize( )成员函数,如前例一样,在Serialize( )函数中填入代码。在此只是简单地串行化文档类的每个成员变量到作为参数所传递过来的存档类参考中。 2. 使用文档类的DeleteContents( ) 使用C l a s s Wi z a r d,在文档类中加入DeleteContents( )重载函数。当选择F i l e / N e w或者F i l e / O p e n菜单命令时,该重载函数被自动调用,提供一个重新初始化文档的机会。 void CWzdDoc:DeleteContents() / called by new and open document / opportunity to initialize the data collections / that make up your document while (!m_WzdInfo1List.IsEmpty() de
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《挖掘机维修电路系统检修手册》
- 硅材料产业园新建工程项目水资源论证报告书
- 边坡治理监测手册
- 铝合金一体化压铸工艺技术手册
- 矿渣微粉项目工程作业指导书
- 检验检测实验大楼项目环境影响报告书(参考范文)
- 在建工程噪声污染管控实施方案
- 室外管网给排水施工技术方案
- 2026年绥滨县带编教师招聘考试备考题库及答案解析
- 现代农业产业园项目社会稳定风险评估报告
- (高清版) ASTM F519-17a ASTM 标准下载
- 团体心理咨询
- 碳中和技术概论全套教学课件
- 《电站锅炉渣井》
- 《政府与非营利组织会计》(第七版)课件 常丽 第1-3章 政府与非营利组织会计概述、政府与非营利组织会计基本理论与方法、政府财政收支管理制度
- 管理学(马工程)教案
- 英语考级-a级词汇完整版
- 数字媒体技术与应用(移动学习版)PPT完整版全套教学课件
- 2023年06月广西柳州市科学技术局招考聘用笔试题库含答案详解版
- 《无人机组装与调试》第7章 固定翼无人机的调试
- SB/T 10654-2012茶馆经营服务规范
评论
0/150
提交评论