MFC编程案例chapter013.pdf

上传人:asd****56 文档编号:70322330 上传时间:2023-01-19 格式:PDF 页数:38 大小:938.86KB
返回 下载 相关 举报
MFC编程案例chapter013.pdf_第1页
第1页 / 共38页
MFC编程案例chapter013.pdf_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《MFC编程案例chapter013.pdf》由会员分享,可在线阅读,更多相关《MFC编程案例chapter013.pdf(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、下载第13章 文件、串行化和数据库本章的例子涉及从简单二进制文件到访问第三方的数据库管理系统等方面的内容。文件串行化的概念是M F C特有的,串行化允许你组织如何保存类对象到磁盘上,以便以较小的代价检索甚至升级它们。串行化从 a r c h i v e文件中保存或调出,a r c h i v e文件其实是一个二进制文件。例63 访问二进制文件讨论用M F C类访问和操作一个简单的二进制文件。例64 访问标准I/O文件讨论用M F C类访问文本文件。例65 访问内存文件讨论创建和操作内存中的二进制文件。尤其是,内存文件可以使你利用文件系统的方法来访问堆内存的单元。例66 在数据类中实现串行化在数

2、据类中加入串行化功能。在本例中不实际串行化任何东西这些留到下五个例子来做。例67 串行化S D I或M D I文档利用M F C的内置功能自动串行化数据类。例68 按要求串行化按要求串行化一个或多个数据类,而不仅仅是保存和装入一个文档。例69 透明地更新串行化的文档讨论怎样如何通过简单地修改新数据类,以转化旧数据,使新数据类仍然能使用旧的串行化文档。例70 串行化多态类串行化一组数据类,这些类的唯一共同点是它们派生于同一个基类。例71 串行化数据集讨论M F C集类内置的串行化功能。例72 访问O D B C数据库讨论怎样使用M F C类访问一个满足O D B C协议的数据库。例73 访问D

3、A O数据库讨论怎样使用M F C类访问一个满足D A O协议的数据库。13.1 例63 访问二进制文件目标在一个平面磁盘文件中维护二进制数据。策略利用M F C的C F i l e类,该类封装了Windows API中处理二进制文件的函数。步骤1.检查文件是否存在要判断某个文件是否已在磁盘上存在,可以使用静态 C F i l e函数GetStatus()。CFileStatus status;if(!CFile: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)

4、;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(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(bu

5、ff 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(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 bytesCFile:begin);

6、/also CFile:end and CFile:currentf 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比想要读取的字节数小或者为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

7、.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()。CFile:Remove(sFile);226第三部分 内部处理实例下载说明C+类中,C F i l e和大多数其他M F C类一样包含了许多一个 C+类中的Windows API调用。C W n d类对于窗口是这样,C M e n u类对于菜单也是这样。关于操作文本文件参见下一个例子。CD说明在C D上执行该工程时,在 W z d Vi e w.c p p的O n TestWzd()函数处设置断

8、点。选取菜单上的Te s t/W z d项,一步步地观察二进制文件的访问。13.2 例64 访问标准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.Form

9、at(%s does 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(Failed to create%s.,sF

10、ile);3.使用文本文件1)写一个文本串到文件中。第13章 文件、串行化和数据库227下载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 e e k ToEnd();f i l e.S e e k ToBegi

11、n();5)从一个文本文件中读一个文本串。file.ReadString(sRecord);6)删除一个文本文件。CFile:Remove(sFile);说明与二进制文件以同样方式对待每个字节所不同的是,标准 I/O文件使用fgets()和fputs()函数获取和输入文本串到文件中。既然C S t d i o F i l e是从CFi l e派生的,在C F i l e中可用的函数在此都可用。CD说明在C D上执行该工程时,在 W z d Vi e w.c p p中的函数O n TestWzd()处设置断点。选取菜单上的Te s t/W z d项,一步步观看标准I/O文件的访问。13.3 例6

12、5 访问内存文件目标在内存中生成一个文件,而不是在磁盘上生成一个临时文件。策略使用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;创建一个C M e m F i l e类对象自动打开一个内存文件。2.使用内存文件1)写内存文件。228第三部分 内部处理实例下载f i l e.Write(buff e r,sizeof(buff e r);2)判断内存文件的当前长度。UINT nBytes=file.G

13、etLength();3)使用以下方法定位下次读写的位置。f i l e.S e e k To E n d();file.Seek(20,/file offset in bytesCFile:begin);/also CFile:end and CFile:currentf i l e.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);说明内存文件为用户在内

14、存中操作数据提供了一种方便的途径,而不必考虑释放和分配堆空间的内存段。另外,内存文件可用作临时(.t m p)文件,这样可以加快应用程序的运行速度,同时没有命名和删除临时文件的麻烦。C M e m F i l e创建的内存文件是在应用程序的堆空间中生成的。若想在全局堆上创建内存文件,相应地要使用 C S h a r e d F i l e,特别是剪贴板要求其获取的数据必须在全局堆中。关于此问题的例子参见例7 6的剪切和粘贴。既然C M e m F i l e是从C F i l e而不是从C S t d i o F i l e派生来的,则必须实现 ReadString()和WriteString

15、()函数,以方便地操作内存文件中的文本数据。CD说明在C D上执行该工程时,在 W z d Vi e w.c p p中的O n TestWzd()函数上设置断点。单击菜单上的Te s t/W z d项,一步一步地观察内存文件的访问。13.4 例66 在数据类中实现串行化目标串行化数据类。策略实现从C O b j c t派生过来的数据类的串行化。M F C的C O b j e c t类添加一个虚重载函数到类中,该函数为Serialize()。我们将用我们自己的 Serialize()重载这个Serialize(),使之装入和保存成员变量到磁盘上。注意 本例中,数据类具有串行化自己的功能。实际如何

16、串行化类到磁盘上参见下例。步骤1.在数据类中加入Serialize()第13章 文件、串行化和数据库229下载从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 CWzdInfo2:Serialize(CArchive&ar)C O b j e c t:S e r i a l

17、i z e(a r);int version=1;i f(a r.I s S t o r i n g()/store datae l s e/load data现在可以利用Serialize()函数调出和保存每一个类的成员变量到存档设备中。如何串行化一个成员变量依赖于变量类型。有三种变量类型:不是从 C O b j e c t派生过来的简单变量,如integers,floats等;从C O b j e c t派生过来的变量;数据集,包括数组和列表。2.串行化简单变量1)要保存数据类中不是从C O b j e c t派生的成员变量,在 Serialize()函数的“保存数据”区使用 重载操作符。

18、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 member variables not derived from CObjectar m_sName;ar 重载操作符。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 datae l s e/load member variables not derived from CObjectar m_sName;ar m_sComment;3.串行化派生于C O b

19、j e c t的变量调用成员变量的Serialize()函数以保存派生于C O b j e c t的成员变量。/load and store member variables derived from CObject230第三部分 内部处理实例下载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)保存数据集,使用如下语句。n

20、Count=m_WzdInfoList.GetCount();/get number of/items inar S e r i a l i z e(a r);注意在这里我们首先保存数据集中工程的数目,然后一步一步地按顺序保存每个工程。2)使用如下语句,装入数据集。/load a list of dataar 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 i s t.A d d Ta i l(p I n f o);关于数据类串行化的

21、详细清单,参见本节的“清单第一个数据类”和“清单第二个数据类”。说明串行化把数据类的每个成员变量按序列地存贮到磁盘上。调出或保存一个文档只不过是串行化上千个数据类而已。只要文档按它保存的顺序调出,就没有必要对文件进行其他控制。正如我们在后面例子看到一样,这种方法可以很快地把旧的文档格式“转化”为新的格式。关于串行化和C O b j e c t类的其他信息参见第2章。串行化的存档设备可以是磁盘文件、内存文件或甚至是别的系统上的文件。在例7 6中可以看到,串行化到内存文件可以为用户提供一种快速易用方式,来剪切和粘贴自己的数据类。一些M F C类可以使用 和 重载操作符来串行化其数据,但是这些类要自

22、己实现这种操作。如C S t r i n g就使用这个操作符。可以通过测试查看还有哪些 M F C类有这样的功能。把保存一个类对象并能在以后恢复它的能力叫做对象“存留”。CD说明本例子的工程称为“S e r i a l i z a t i o n”,开始时在W z d D o c.c p p中Serialize()上设置断点。然后第13章 文件、串行化和数据库231下载单击Te s t/W z d菜单命令填充文档,之后单击F i l e/S a v e开始串行化功能。清单第一个数据类#ifndef WZDINFO1_H#define WZDINFO1_H#include afxtempl.h#

23、include WzdInfo2.hclass CWzdInfo1:public CObjectp u b l i c:C W z d I n f o 1();C W z d I n f o 1();/misc infoCString m_sGroupName;CString m_sComment;CList m_WzdInfo2List;void Serialize(CArchive&archive);#e n d i f/WzdInfo1.cpp:implementation of the CWzdInfo class/#include stdafx.h#include WzdInfo1.

24、h/CWzdInfoC W z d I n f o 1:C W z d I n f o 1()m _ s G r o u p N a m e=_ T();m _ s C o m m e n t=_ T();C W z d I n f o 1:C W z d I n f o 1()while(!m_WzdInfo2List.IsEmpty()delete m_WzdInfo2List.RemoveHead();void CWzdInfo1:Serialize(CArchive&ar)232第三部分 内部处理实例下载C O b j e c t:S e r i a l i z e(a r);int

25、nCount;if(ar.I s S t o r i n g()/name and commentar m_sGroupName;ar m_sComment;/other listnCount=m_WzdInfo2List.GetCount();ar nCount;for(POSITION pos=m_WzdInfo2List.GetHeadPosition();pos;)CWzdInfo2*pInfo=m_WzdInfo2List.GetNext(pos);ar m_sGroupName;ar m_sComment;/other listar nCount;CObject*pInfo;whi

26、le(nCount-0)ar pInfo;m _ W z d I n f o 2 L i s t.A d d Ta i l(C W z d I n f o 2*)p I n f o);清单第二个数据类#ifndef WZDINFO2_H#define WZDINFO2_Hclass CWzdInfo2:public CObjectp u b l i c:enum STATES O L D,N E W,M O D I F I E D,第13章 文件、串行化和数据库233下载D E L E T E D;D E C L A R E _ S E R I A L(C W z d I n f o 2)C

27、W z d I n f o 2();CWzdInfo2(CString sName,int nVe r s i o n);void Set(CString sName,CString sComment,int nVersion,int nState);/misc infoCString m_sName;CString m_sComment;int m_nState;void Serialize(CArchive&archive);CWzdInfo2&operator=(CWzdInfo2&src);#e n d i f/WzdInfo2.cpp:implementation of the CW

28、zdInfo class/#include stdafx.h#include WzdInfo2.h/CWzdInfoIMPLEMENT_SERIAL(CWzdInfo2,CObject,0)C W z d I n f o 2:C W z d I n f o 2()m _ s N a m e=_ T();m _ s C o m m e n t=_ T();m _ n S t a t e=C W z d I n f o 2:N E W;CWzdInfo2:CWzdInfo2(CString sName,int nVersion):m _ s N a m e(s N a m e),m _ n Ve

29、r s i o n(n Ve r s i o n)m _ s C o m m e n t=_ T();m _ n S t a t e=C W z d I n f o 2:O L D;void CWzdInfo2:Set(CString sName,CString sComment,int nVersion,int nState)234第三部分 内部处理实例下载m _ s N a m e=s N a m e;m _ s C o m m e n t=s C o m m e n t;m _ n S t a t e=n S t a t e;void CWzdInfo2:Serialize(CArchi

30、ve&ar)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()/dataar m_sName;ar m_sComment;ar m_sName;ar m_sComment;ar m_nState;CWzdInfo2&CWzdInfo2:operator=(CWzdInfo2&src)if(this!=&src)m_sName=src.m_sName;m_sComment=src.m_sComment;m_nState=src.m_nState;return*this;13.5 例67 串行化SDI或MDI文档目标利用

31、M F C框架的内建特征串行化S D I和M D I文档到磁盘。策略利用文档类中的两个函数实现从磁盘中调出文档或串行化文档到磁盘上。第一个是文档第13章 文件、串行化和数据库235下载类的Serialize()函数,通过对它编程,系统地调用文档中每个数据类实例的 Serialize()成员函数(在前例中,我们已经添加了该成员函数)。第二个是DeleteContents(),用来初始化文档。我们还将编辑一段代码来定制打开文件对话框的文档扩展名。步骤1.使用文档类的Serialize()定位D o c u m e n t类的Serialize()成员函数,如前例一样,在Serialize()函数中

32、填入代码。在此只是简单地串行化文档类的每个成员变量到作为参数所传递过来的存档类参考中。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 m

33、ake up your documentwhile(!m_WzdInfo1List.IsEmpty()delete m_WzdInfoList.RemoveHead();C D o c u m e n t:D e l e t e C o n t e n t s();在D o c u m e n t类中不必添加其他重载函数或消息处理函数。当单击 F i l e/N e w或者F i l e/O p e n时,应用程序框架将自动地打开一个 Open File对话框,提示用户输入一个文件名。一旦选定,应用程序将打开一个文件和一个存档,然后调用文档类的 DeleteContents()。一旦文档被初始

34、化,应用程序会调用Serialize()函数。用户选择F i l e/s a v e或File/Save As时也是如此。如果用户单击的是F i l e/N e w菜单命令,只有DeleteContents()被调用。自动打开的File Dialog使用你给出的文件扩展名,在文件列表中过滤掉其他非此类型的文档。也可在使用A p p Wi z a r d创建应用程序时指定这个文件扩展名。如果没有这么做,也可以在应用程序的字符串表中编辑一个字符串,指定文件扩展名。3.指定文件扩展名为了定制在应用程序中打开供用户选择文件名的文件对话框,可以在字符串资源表中编辑一个字符串。定位定义文档类型的字符串。在

35、本例中,I D为I D C _ W Z D T Y P E。对这个字符串所需的修改如下面灰底和下划线的部分。nWzdnWzdnWzd Files(*.wzd)n.wzdnWzd.DocumentnWzd Document说明严格地说,即使是DeleteContents(),也只是在S D I应用程序才被用到。当一个M D I应用程序打开一个新的或已经存在的文档时,一个新的文档类被创建。因此,任意文档的初始化工作都可以在文档类的构造函数中进行。但是,习惯上应使用 DeleteContents()。236第三部分 内部处理实例下载CD说明本例子的工程叫“S e r i a l i z a t i

36、o n”。首先在W z d D o c.c p p中的Serialize()上设置断点。然后单击Te s t/W z d菜单命令来填充文档。最后,单击 F i l e/s a v e开始串行化工作。清单文档类/WzdDoc.h:interface of the CWzdDoc class/#if!defined(AFX_WZDDOC_H_CA9038EE_B0DF_11 D 1 _ A 1 8 C _ D C B 3 C 8 5 E B D 3 4 _ _ I N C L U D E D _)#define AFX_WZDDOC_H_CA9038EE_B0DF_11 D 1 _ A 1 8 C

37、 _ D C B 3 C 8 5 E B D 3 4 _ _ I N C L U D E D _#if _MSC_VER=1000#pragma once#endif/_MSC_VER=1000#include afxtempl.h#include WzdInfo1.h#include WzdInfo2.hclass CWzdDoc:public CDocumentprotected:/create from serialization onlyC W z d D o c();D E C L A R E _ D Y N C R E AT E(C W z d D o c)/Attributesp

38、 u b l i c:CList*GetInfo1List()return&m_WzdInfo1List;/Operationsp u b l i c:/Overrides/ClassWizard generated virtual function overrides/A F X _ V I RT U A L(C W z d D o c)p u b l i c:virtual void Serialize(CArchive&ar);virtual void DeleteContents();virtual BOOL OnNewDocument();/A F X _ V I RT U A L/

39、Implementationp u b l i c:virtual CWzdDoc();#ifdef _DEBUGvirtual void AssertValid()const;virtual void Dump(CDumpContext&dc)const;第13章 文件、串行化和数据库237下载#e n d i fp r o t e c t e d:/Generated message map functionsp r o t e c t e d:/A F X _ M S G(C W z d D o c)/NOTE-the ClassWizard will add and remove me

40、mber functions here./DO NOT EDIT what you see in these blocks of generated code!/A F X _ M S GD E C L A R E _ M E S S A G E _ M A P()p r i v a t e:CList m_WzdInfo1List;/A F X _ I N S E RT _ L O C AT I O N /Microsoft Developer Studio will insert additional declarations immediately/before the previous

41、 line.#endif/!defined(A F X _ W Z D D O C _ H _ _ C A 9 0 3 8 E E _ B 0 D F _ 11 D 1 _ A 1 8 C _ D C B 3 C 8 5 E B D 3 4 _ _ I N C L U D E D _)/WzdDoc.cpp:implementation of the CWzdDoc class/#include stdafx.h#include Wzd.h#include WzdDoc.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char

42、 THIS_FILE=_FILE_;#e n d i f/CWzdDocI M P L E M E N T _ D Y N C R E ATE(CWzdDoc,CDocument)BEGIN_MESSAGE_MAP(CWzdDoc,CDocument)/A F X _ M S G _ M A P(C W z d D o c)/NOTE-the ClassWizard will add and remove mapping macros here./DO NOT EDIT what you see in these blocks of generated code!/A F X _ M S G

43、_ M A PE N D _ M E S S A G E _ M A P()238第三部分 内部处理实例下载/CWzdDoc construction/destructionC W z d D o c:C W z d D o c()/TODO:add one-time construction code hereC W z d D o c:C W z d D o c()BOOL CWzdDoc:OnNewDocument()if(!CDocument:OnNewDocument()return FA L S E;return TRUE;/CWzdDoc serializationvoid CW

44、zdDoc:Serialize(CArchive&ar)int nCount;if(ar.I s S t o r i n g()nCount=m_WzdInfo1List.GetCount();ar S e r i a l i z e(a r);e l s ear nCount;while(nCount-0)CWzdInfo1*pInfo=new CWzdInfo1;p I n f o-S e r i a l i z e(a r);m _ W z d I n f o 1 L i s t.A d d Ta i l(p I n f o);第13章 文件、串行化和数据库239下载/CWzdDoc d

45、iagnostics#ifdef _DEBUGvoid CWzdDoc:AssertValid()constC D o c u m e n t:A s s e r t Va l i d();void CWzdDoc:Dump(CDumpContext&dc)constC D o c u m e n t:D u m p(d c);#endif/_DEBUG/CWzdDoc commandsvoid CWzdDoc:DeleteContents()/called with new and open document/opportunity to initialize the data collec

46、tions that make up our documentwhile(!m_WzdInfo1List.IsEmpty()delete m_WzdInfo1List.RemoveHead();C D o c u m e n t:D e l e t e C o n t e n t s();13.6 例68 按要求串行化目标随时手工串行化数据类。策略假定已经为每一个数据类添加了一个 Serialize()函数,如例6 6所示。在这里,我们将打开一个文件和存档,然后串行化数据类到存档中。步骤1.保存串行化的数据类1)保存任何有Serialize()函数的数据类到磁盘上。首先,创建一个文件;然后,打

47、开一个240第三部分 内部处理实例下载C A r c h i v e类的实例。CFile file;if(file.Open(filename.ext,CFile:modeCreate|C F i l e:m o d e Wr i t e)CArchive ar(&file,CArchive:store);注意,在这里创建存档实例时使用的是 C A r c h i v e:s t o r e标志。2)使用该存档调用Serialize()函数在相应的数据类中循环。本例子中,我们串行化 C L i s t变量。CList*pList=G e t D o c u m e n t()-G e t I

48、n f o 1 L i s t();nCount=pList-GetCount();ar GetHeadPosition();pos;)CWzdInfo1*pInfo=pList-GetNext(pos);p I n f o-S e r i a l i z e(a r);3)串行完之后,首先关闭存档,然后关闭存档和文件。a r.C l o s e();f i l e.C l o s e();2.调出串行化的数据类为了调出串行化数据类,首先打开一个文件,然后再打开存档调出数据。CFile file;if(file.Open(filename.ext,CFile:modeRead)CArchive

49、 ar(&file,CArchive:load);CList*pList=G e t D o c u m e n t()-G e t I n f o 1 L i s t();ar nCount;while(nCount-0)CWzdInfo1*pInfo=new CWzdInfo1;p I n f o-S e r i a l i z e(a r);p L i s t-A d d Ta i l(p I n f o);a r.C l o s e();f i l e.C l o s e();注意,在这里创建存档实例时使用的是 C A r c h i v e:l o a d标志。说明若不想使用应用框架

50、自动文档调出和保存功能,这种方法是非常有用的。例如,应用程序想保存自己的数据库和日志。后面,将使用这种方法来实现剪切和粘贴,将串行化一个共享的内存文件,而不是一个C F i l e类对象。第13章 文件、串行化和数据库241下载CD说明本例的工程称为“S e r i a l i z a t i o n”。首先在W z d D o c.c p p中的Serialize()函数上设置断点。然后单击Te s t/W z d菜单命令填充文档。最后单击F i l e/S a v e开始串行化工作。13.7 例69 透明地更新串行化的文档目标在不创建转换应用程序的情况下,让用户访问和转换应用程序文档的旧版

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁