注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 32位开发 > C/C++ 内容正文:为C++程序添加文件保存加载功能

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

发布时间:2006-05-05 19:03:22 来源:天极网 网友评论 0 条

    一、引子

  为什么要浪费时间去设计一个算法来实现数据的文件存储还要费劲地调试代码呢?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;
  template
  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指出,你不需要任何的函数,包括在派生类中的那些,调用你的串行化方法;只需由串行化库来调用即可。因此,为了保护你的类,需要把串行化功能声明为私有的,然后允许有限制地存取该串行化库,这通过把类boost::serialization::access声明为你的类的友元来实现,见代码。

  接下去是串行化函数,它是一个模板函数。如果你对模板还不太熟悉的话,不要紧:你不需要理解模板部分而照旧可以使之工作。然而,必须确保你理解了串行化功能的核心:

ar & x;
ar & y;

  首先,让我声明一下:这两行代码并不是声明参照引用变量,虽然形式上看上去相似。代之的是,它们调用一个&操作符,并且把你的类成员写入到文件中或者把它们读进来。是的,你已经正确地认出了;该功能实现了一石二鸟(或者更准确地说,用一套代码完成了两件任务)的功效。当你在把一个Vertex对象保存到一个文件中去时,串行化库调用这个串行化功能;第一行把x的值写入到文件中,第二行把y的值写入到文件中。后来,当你把一个Vertex对象从文件中读回时,第一行实现从文件中读回x值,第二行实现从文件中读回y值。

  这是某种特别的操作符重载!事实上,&字符是一个在串行化库内部定义的一个操作符。幸好你不需要理解它是如何工作的。

  好,就是那么简单。下面是一些示例代码,你可以试着把一个Vertex 对象保存到一个文件中:

Vertex v1(1.5, 2.5);
std::ofstream ofs("myfile.vtx");
boost::archive::text_oarchive oa(ofs);
oa << v1;
ofs.close();

  就是这样!第一行产生Vertex对象。下面的四行打开一个文件,把一个特定的串行化类与文件相结合,然后写向文件,最后关闭文件。下面是一段把一个Vertex 对象从文件中读入的代码:

Vertex v2;
std::ifstream ifs("myfile.vtx", std::ios::binary);
boost::archive::text_iarchive ia(ifs);
ia >>v2;
ifs.close();
v2.dump();

  这段代码生成一个Vertex的实例,然后再打开一个文件(这次是为读取的目的),把一个串行化类与文件相关联,把对象读进来,然后关闭文件。最后,代码输出Vertex的值。如果你把前面的这两个程序段放在一个main函数中并运行,你会看到输出两个原始值:1.5和2.5。

  注意

  注意我使用的文件扩展名是:.vtx。这并不是一个专门的扩展名;它是我自己定制的扩展名。这听起来有点愚蠢和琐碎,但是实际上,我们是在创建自己的文件格式。为了指出这一特殊的文件格式,我使用了扩展名叫.vtx,其意指Vertex。

相关文章
  • 伪随机数生成及在VC++中的实现
  • Visual C++常用数据类型转换详解
  • 为VC++应用程序对话框添加透明位图
  • 用Visual C++实现屏幕抓程序
  • 用VC++模拟实现QQ密码盗窃软件
【评论】【收藏本文】【打印】【关闭】
上一篇文章:C++/CLI思辨录之代理构造函数
下一篇文章:在MFC下如何定义全局变量和全局函数
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
推荐阅讯
  • 在MFC下如何定义全局变量和全局函数
  • C++的iostream标准库介绍
  • C++运算符重载转换运算符
  • Visual C++泛型编程实践
  • Visual C++中调用DLL实现数据加密
  • 使用VC++ ATL实现Office的COM插件
  • 用Viusal C++实现字符串分割函数
  • VC++实现混合静态分裂视窗的方法
  • C/C++中多维数组的指针作为函数参数传递!
  • 漫谈C++ Builder多线程编程技术
阅读排行
  • 1.Borland 发布C++ Builder 2006 RAD 环境
  • 2.C/C++程序员应聘常见面试题深入剖析
  • 3.Visual C++常用数据类型转换详解
  • 4.C++中的 static 关键字
  • 5.利用VC++实现局域网实时视频传输
  • 6.浅谈C/C++内存泄漏及其检测工具
  • 7.英国投票否决C++/CLI 微软强攻ISO标准受挫
  • 8.VC++下用MSComm控件实现串口通讯
  • 9.伪随机数生成及在VC++中的实现
  • 10.VC++编程实现对波形数据的频谱分析
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载