为C++程序添加文件保存加载功能.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
为C程序添加文件保存加载功能

为C++程序添加文件保存加载功能 一、引子   为什么要浪费时间去设计一个算法来实现数据的文件存储还要费劲地调试代码呢?Boost库可以为你做这些事情。借助于串行化模板,你可以容易地把数据存储到你自己定制格式的文件中。本文将教给你如何轻松地存储数据并回读数据。   二、概述   当你开发一个软件包时,你总是想集中精力于软件的功能。而最让你担心的是,花费大量的时间写代码,而该代码有可能会应用在另外大量的其他程序中。那正是重用的含义所在,你会希望另外某人已经为你编写出这样现成的代码。   这类问题的一个很好的例子是给予你的程序存档的能力。例如,你可能在写最伟大的天文学程序-在该程序中,你的用户可以轻易地输入时间和坐标,你的程序负责绘制当前天空的地图。但是,假定你赋予你的用户能够高亮某些星星,这样以来它们可以容易地突出在地图上。最后,你让用户能够保存他们的配置以备后用。   你的程序集中于天文学编程。你并不是在写一个通用库来保存文档,所以你不必把大量的时间花在存储功能上,因为你要专注于程序的天文学特性。如果你是用C++编程,你可以从Boost重用库得到帮助。为了保存文件,Boost库包括一个串行化类,正是你需要的。   如果你成功地创建了你的程序工程,很可能有一个类来包含用户信息或文档。例如,你可能有一个类,该类列举用户们最喜欢的星星的名字和位置。(请原谅这里的简化)。这就是你希望用户能够保存到磁盘上的数据。毕竟,几乎所有的程序都有文件保存功能。微软的Word保存文本和格式化数据,而Excel保存工作单数据。一个优秀的地图程序可以用户保存喜欢的位置,GPS路线,旅程,等等。   借助于Boost串行化库的帮助,实现保存很容易-所要做是仅仅是设置好你的类,而由库来负责其它一切-使你专注于真正的工作。   其思想是很简单的:你创建了一个包含用户数据的对象。当准备保存信息时,用户选择File|Save As,然后从文件对话框中选择一个文件名即可。借助于Boost,你的程序就把数据保存到选定的文件中。以后,当用户重新启动该程序时,选择File|Open,选定已保存的文件,你的程序再一次使用Boost-但是这一次重新装入数据,因此,重新产生了该对象。瞧,用户数据被回复了!或者,从用户的角度来看,文档已被打开。   下面的例子只是简单地演示保存和加载一些图形类。第一个类,Vertex,描述了一个二维的点。第二个类,Polygon,包含一个Vertex实例的容器。第三个类,Drawing,包含一个Polygon的容器。   想把所有这些都保存到一个文档中去无疑是一个恶梦-这不是花费时间的地方-你要实现最好的图形程序设计,因为这是你的专长。好了,让Boost库为你做其它一切吧。   三、串行化一个类   首先,考虑一下Vertex类。该类是最容易串行化的一个,因为它不包含其它对象。该类包含两个值,x和y,且都是double型。我还给该类定义了几个存取x和y的函数,还有一个dump函数,它负责把x和y的值输送到控制台。最后,我包含了两个构造器,一个是缺省的,另一个用作输入参数。(为了简化起见,该例程并没有做任何实际的绘图。抱歉!)   下面最吸引人的部分是必需的代码行以串行化该类。下面就是该类(注意粗体部分): class Vertex {  private:   friend class boost::serialization::access;   templateclass Archive   void serialize(Archive ar, const unsigned int version)   {    ar x;    ar y;   }   double x;   double y;  public:   Vertex() {} // 串行化需要一个缺省的构造器   Vertex(double newX, double newY) : x(newX), y(newY) {}   double getX() const { return x; }   double getY() const { return y; }   void dump() {    cout x y endl;   } };   注意在程序的最后,我没有实际地使用缺省的构造器Vertex(),但是串行化库的确调用了它,因此我需要把它包含进去。   串行化部分首先串行化库存取私有成员,特别是接下来的串行化函数。串行化库的创建者Robert Ramey指出,你不需要任何的函数,包括在派生类中的那些,调用你的串行化方法;只需由串行化库来调用即可。因此,为了保护你的类,需要把串行化功能声明为私有的,然后允许有限制地存取该串行化库,这通过把类

文档评论(0)

pep2233 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档