C++初学者指南 第十一篇(11)

本文介绍了一个简单的文件比较工具的实现过程,通过逐字节对比两个文件的内容来判断它们是否完全一致。程序支持从命令行传入文件路径,并能处理无法打开文件的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工程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. 我们还可以自己增强上面的程序。比如,增加选择,用于在比较文件的时候或略字符的大小写;还可以增加选项用来显示两个文件是在什么地方开始不相同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值