工程11-1 一个简单的文件比较工具
通过这个工程,我们创建一个简单而实用的文件比较工具。程序通过对两个文件进行读取和比较的操作来判断文件是否相同。如果找到了一处不相同的地方,则两个文件内容不同。如果同时遇到两个文件的结束,并且没有发现不同之处,则说明两个文件的内容是完全相同的。
步骤:
1. 创建一个名称为CompFiles.cpp的文件。
2. 在该文件中增加如下的代码:
#include <iostream>
#include <fstream>
using namespace std;
int main( int argc, char *argv[])
{
register int i;
unsigned char buf1[1024], buf2[1024];
if ( argc != 3)
{
cout <<"Usage: comfiles <file1> <file2>\n";
return 1;
}
注意:两个文件的名称是通过命令行指定的。
3. 增加以二进制方式打开两个文件的代码。如下:
ifstream f1(argv[1], ios::in | ios::binary);
if ( !f1 )
{
cout << "Cannot open fist file.\n";
return 1;
}
ifstream f2(argv[2], ios::in | ios::binary);
if ( !f2 )
{
cout << "Cannot open second file.\n";
return 1;
}
我们以二进制格式打开文件是为了避免文本方式打开时有可能进行的格式字符转换操作。
4. 增加进行实际比较的代码,如下:
do
{
f1.read((char*)buf1, sizeof(buf1));
f2.read((char*)buf2, sizeof(buf2));
if(f1.gcount() != f2.gcount())
{
cout << "Files are of differsing sizes.\n";
f1.close();
f2.close();
return 0;
}
for ( i = 0; i < f1.gcount(); i++)
{
if (buf1[i] != buf2[i])
{
cout << "Files differ.\n";
f1.close();
f2.close();
return 0;
}
}
} while (!f1.eof() && !f2.eof());
cout << "Files are the same.\n";
上面的这段代码使用read()函数每次都从两个文件中读取等量的数据,然后对缓冲区中的数据进行比较。如果发现不同之处,则关闭两个文件,并在屏幕上显示“Files differ.”,然后程序结束。否则,继续从两个文件中读取数据到缓冲区中,并进行比较,直到遇到一个文件结束。由于在遇到文件结束的时候很有可能读取到得数据没有能够填满缓冲区,在程序中我们用到了gcount()来精确判断缓冲区中数据的多少。如果其中一个缓冲区中的数据数量小于另外一个缓冲区,那么在遇到一个文件结束的时候两次gcount()返回的值将会不相等,此时程序会显示“Files are of differing sizes.”。
5. 最后,如果两个文件的内容相同,此时当遇到一个文件结束的时候,另外一个文件的读取也会结束。通过调用eof()函数我们可以确定这一点。如果两个文件的内容和和长度都相等,则这两个文件是相同的。
最后,程序关闭两个文件,如下:
f1.close();
f2.close();
return 0;
}
6. 完整的FileComp.cpp程序如下:
/*
工程11-1
创建文件比较工具
*/
#include <iostream>
#include <fstream>
using namespace std;
int main( int argc, char *argv[])
{
register int i;
unsigned char buf1[1024], buf2[1024];
if ( argc != 3)
{
cout <<"Usage: comfiles <file1> <file2>\n";
return 1;
}
ifstream f1(argv[1], ios::in | ios::binary);
if ( !f1 )
{
cout << "Cannot open fist file.\n";
return 1;
}
ifstream f2(argv[2], ios::in | ios::binary);
if ( !f2 )
{
cout << "Cannot open second file.\n";
return 1;
}
cout << "Comparing files...\n";
do
{
f1.read((char*)buf1, sizeof(buf1));
f2.read((char*)buf2, sizeof(buf2));
if(f1.gcount() != f2.gcount())
{
cout << "Files are of differsing sizes.\n";
f1.close();
f2.close();
return 0;
}
for ( i = 0; i < f1.gcount(); i++)
{
if (buf1[i] != buf2[i])
{
cout << "Files differ.\n";
f1.close();
f2.close();
return 0;
}
}
} while (!f1.eof() && !f2.eof());
cout << "Files are the same.\n";
f1.close();
f1.close();
return 0;
}
7. 运行程序的时候,我们可以复制CompFile.cpp的内容到一个文本文件temp.txt中。然后在命令行键入:CompFiles CompFiles.cpp temp.txt
程序会输出两个文件是相同的。我们还可以把CompFiles.cpp和别的文件进行比较,比如可以和别的章节中的程序文件进行比较,可以看到程序显示文件是不同的。
8. 我们还可以自己增强上面的程序。比如,增加选择,用于在比较文件的时候或略字符的大小写;还可以增加选项用来显示两个文件是在什么地方开始不相同的。