快速业务通道

用标准模板库STL实现文件比较

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
ain()函数的精华在于:

typedef vector<string> stringSet;

它定义了一个向量的容器类型,用于存储字符串对象。如果不熟悉什么是向量,可参考文末链接有关于向量的指南。字符串集(stringSet)对象是STL数据类型,其中封装了各个字符串。类型定义typedef使它成为可重复使用的数据类型并使得代码可读性很强。

stringSet s1, s2,s3;

声明了3个容器,指向所含的字符串集合。前2个包含各个输入的文件内容,后面一个则存放不同的字符串。当然变量名应该描述得更正规些。

populate_set_from_file()函数将文件内容读进容器。它是个函数模板,可以使用不同类型的参数。它的构成如下:

template<class T>
bool populate_set_from_file(T &s1,const char *file_name)
{
ifstream file_in;
string line_from_file;

file_in.open(file_name);
if(file_in.fail()){
 cout << "Error opening file ["
 << file_name << "] - please check file name" << endl;
 return false;
}
try{
 getline(file_in,line_from_file);
 while(file_in.good())
 {
 addElementToSet(s1,line_from_file);
 getline(file_in,line_from_file);
 }
}
catch(bad_alloc &e)
{
 cout << "Error - Caught Exception: " << e.what() << endl;
 throw e;
 return false;
}

file_in.close();
return true;
}

这是一个函数模板,它将文件逐行读进它定义的容器类型里。函数打开给定的文件,逐行阅读(回车换行符结尾)并加入到容器(容器可以是模板支持的任何类型)中去。用addElementToSet函数将每行文件加入到容器,这也是个函数模板。

用STL的文件流对象(ifstream)来读取文件。ifstream支持基本的文件I/O和出错处理。当文件操作失败时,它的fail()成员函数返回真(true)。文件全部正常读取完毕后,成员函数good()返回真。

getline()是STL函数,读取文件中的每一行字符直至读到行结束符(行结束符不读进字符串)。它的参数是源文件流和字符串对象。要注意,它在读取行字符串时不过滤头尾的空格字符。

其它是出错处理过程 - 虽然不是很理想的方式,但本例还是用它。当line_from_file对象中的字符串过长时将抛出bad_alloc出错信息。

函数的文件名参数file_name是常量(const)参数,表示该参数为只读,不被修改。使用常量参数让编译器产生一个只读的快速内存映象并使应用程序变得更小些。

addElementToSet也是一个模板函数。容器的使用有时显得很复杂。有些容器用insert()方法来添加成员,另一些容器却用push_back()[译者注:容器的种类很多,队列(list)用前者而堆栈(stack)用后者]。更为复杂的是映象(map),它用insert()增加成员,带入的参数却是pair<>。虽然可以重载容器的函数,但我选择使用模板。这样可以更为灵活,甚至可以用于新的或未知的容器。

addElementToSet函数代码如下:

template<class C,class V >
void addElementToSet(C &c, const V &v)
{
  c.insert(v);
}

模板的容器类是C,传递的参数是V(V被声明为常量参数,是只读的。记住,一个V的拷贝被加入到C)。用insert()函数将V加入到C。这对于支持insert()方法的容器是很方便的,但对其他一些容器就有问题了。

对于这样的容器,比如向量(vector)使用push_back()来添加成员,模板要进行特例化处理。C++模板支持类属理念,但类属执行时仍将优化成某种特定类型。模板的特例化与重载类似。

下面代码将addElementToSet特例化为向量(vector):

template<> void addElementToSet<vector<string>,string>
 (vector<string> &c, const string &v) {
c.pus

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号