快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

要阅读本文,你要熟悉C++,熟悉类模板和函数模板。本文汇集了大量有关的信息,指引你逐步阅读。

本文用提问,设计和解决方案引导阅读。希望你能喜欢。

问题提出:

有二篇文章都含有许多行文字。我们要建立一个程序来找出二者之间的不同之处并将这些不同内容的行显示出来。程序必须做成可重复使用的组件,就是说,这个组件能够未经修改地被其他程序使用。

设计:

假设这二个文件非常之大(每个文件都有数千行),我们这样设计有关解决方案:

将各个文件读进内存块,

在内存块中进行文件内容比较,

将不同之处放进一个新的第三个内存块。

设计方案还要考虑到各个文件的元素位置可能不同,亦即相同的元素不一定在同一行里。这意味着,必须在内存中遍历搜索不相同的术语并将其存放在第三个内存块中。

考虑到程序的可重用性,我们用类属编程技术来设计,让方案能够适应于存储介质的变化。

当文件很大时(每个文件有数千行),那么要把每个文件都存储进内存可能是不现实的。另外也给执行过程带来困难。

执行细节:

可以用容器来设计,比如用数组或队列,将字符数组存储到容器中。不过这会使得程序的可读性降低并导致组件的可重用性下降。

本文的解决方案用标准模板库(Standard Template Library, STL)的容器来管理内存块。并且用STL的元素来管理将文件读进内存块。这样的设计方案使得程序具有模板容器级水平的可读性。

为达到互用水准的目的,就要使用C++的类模板和函数模板技术来实现。如果你不熟悉这些模板或要复习一下,可参看文末的链接。

方案与指南

你写的程序是给二部分人看的:最终用户和程序开发人员。写给程序员是因为有人可能对你的程序作某些更改。他们必须花时间来理解你的程序。也可能就是你自己在以后的时间里要对程序作出修改 - 改善它的可读性而不降低运行效率,或者增加一系列注释。

举例来说,让我们看一下主函数main():

int main(int argc, char* argv[])
{
// 确认得到正确的参数数量
if(argc!=3)
{
 cout << "compareFiles - copyright (c) Essam Ahmed 2000" << endl << endl;
 cout << "This program compares the conents of two files and prints" << endl
 << "the differences between the files to the screen" << endl << endl;
 cout << "Usage: compareFiles <file_name_1> <file_name_2>" << endl << endl;
 return 1;
}
// 声明要使用的容器
typedef vector<string> stringSet;
stringSet s1, s2,s3;

// 将第一篇文章读进集合
populate_set_from_file(s1,argv[1]);
cout << "Contents of Set 1" << endl << endl;
for_each(s1.begin(),s1.end(),printElement);

// 将第二篇文章读进集合
populate_set_from_file(s2,argv[2]);
cout << endl << "Contents of Set 2" << endl << endl;
for_each(s2.begin(),s2.end(),printElement);

/// 比较集合,将不同之处存放到s3
Container_Differences< stringSet,string > (s1,s2,s3);

// 显示结果
cout << endl << "Difference is:" << endl;
for_each(s3.begin(),s3.end(),printElement);
return 0;
}

这里不过多论述如何读文件和比较文件内容,这些都是封装的工作。这里关心的是函数扮演的角色。在本例中,main()函数扮演发报机的角色,而由其他函数执行真正的工作。

可以看到函数的功能,比如populate_set_from_file()和Container_Differences()函数执行大多数核心工作。for_each()函数则是STL的运算规则。

m

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号