这不是逐字节比较:为什么

时间:2014-07-18 17:18:13

标签: c loops pointers byte infinite

我想拿两个文件,逐字节比较,并测试它的性能,

到目前为止,这就是我的代码:

#include<stdio.h>
#include <time.h>

int main()
{
    FILE *fp1, *fp2;
    int ch1, ch2;
    char fname1[40], fname2[40] ;

    printf("Enter name of first file :") ;
    gets(fname1);

    printf("Enter name of second file:");
    gets(fname2);

    clock();    

    fp1 = fopen( fname1,  "r" );
    fp2 = fopen( fname2,  "r" ) ;

    if ( fp1 == NULL )
    {
        printf("Cannot open %s for reading\n", fname1 );
        exit(1);
    }
    else if (fp2 == NULL)
    {
        printf("Cannot open %s for reading\n", fname2 );
        exit(1);
    }
    else
    {
        ch1  =  getc( fp1 ) ;
        ch2  =  getc( fp2 ) ;

        while( (ch1!=EOF) && (ch2!=EOF) && (ch1 == ch2))
        {
            ch1 = getc(fp1);
            ch2 = getc(fp2);
        }

        if (ch1 == ch2)
            printf("Files are identical\n");
        else if (ch1 != ch2)
            printf("Files are Not identical\n");

        fclose ( fp1 );
        fclose ( fp2 );
    }

    printf("That took %d seconds.\n", clock() / CLOCKS_PER_SEC);

    return 0;
}

我被告知:&#34; ==&#34;不是逐字节比较,我如何实现这一点,以便我可以按位运算?

另外,有没有办法检查单个文件本身有多少重复?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

在示例2中,您没有检查文件结尾。这就是为什么它永远不会停止。

您正逐字节进行比较。我认为一旦修复第二个版本,两个版本都会没问题。

您可能会考虑另外几件事:

  • 如果这可能在Windows计算机上运行,​​请使用“rb”而不是“r”,以便Windows不会转换行结束字符。
  • 您可能想要添加ferror()测试以及EOF。你通常不需要它,但我通常包括它以防万一。