Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用异或逐位操作执行逐字节比较_C_Hash_Bit Manipulation_Xor_Duplication - Fatal编程技术网

C 使用异或逐位操作执行逐字节比较

C 使用异或逐位操作执行逐字节比较,c,hash,bit-manipulation,xor,duplication,C,Hash,Bit Manipulation,Xor,Duplication,我想取两个文件,逐字节比较,测试它的性能 到目前为止,我的代码是这样的: #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("Ent

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

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

#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;
}
#包括
#包括
int main()
{
文件*fp1,*fp2;
int ch1,ch2;
char fname1[40],fname2[40];
printf(“输入第一个文件的名称:”);
获取(fname1);
printf(“输入第二个文件的名称:”);
获取(fname2);
时钟();
fp1=fopen(fname1,“r”);
fp2=fopen(fname2,“r”);
如果(fp1==NULL)
{
printf(“无法打开%s进行读取”,fname1);
出口(1);
}
else if(fp2==NULL)
{
printf(“无法打开%s进行读取”,fname2);
出口(1);
}
其他的
{
ch1=getc(fp1);
ch2=getc(fp2);
而((ch1!=EOF)&&(ch2!=EOF)&&&(ch1==ch2))
{
ch1=getc(fp1);
ch2=getc(fp2);
}
如果(ch1==ch2)
printf(“文件相同\n”);
否则如果(ch1!=ch2)
printf(“文件不相同\n”);
fclose(fp1);
fclose(fp2);
}
printf(“这花费了%d秒。\n”,clock()/CLOCKS\u/SEC);
返回0;
}
这段代码比较两个文件是否相同,但我想通过使用XOR的逐位操作来检查一下,有什么办法吗

有没有办法一次读取一个字节的文件


提前谢谢你的帮助

让代码保持原样并在主循环中更改它怎么样

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

快速提示:您已经在逐字节读取文件
getc()
只从文件中读取一个字符,然后将其存储为int。从
getc()
函数的描述:
成功后,将返回读取的字符(提升为int值)

您所说的“但我想检查一个文件本身是否有重复”是什么意思?我有一个想法,有没有办法一次读取一个字节的文件?很抱歉,这是一个输入错误,我只想使用XORIf两个相同的字节逐字节比较两个文件,然后在执行XOR逐位操作后,结果应该是零,但我在实现这一点上遇到了问题。是否确实要在每次字节匹配时打印:“文件相同\n”?i、 如果你有一个4KB的文件,你可以将这封邮件打印4096次。我认为答案是否定的。此外,如果你真的对性能感兴趣,那么你将把所有的时间都花在打印上,而不是实际比较文件上。您需要将结果放在bool中,并在函数末尾打印出来。此外,可能值得一提的是,如果编译器愿意,它可以免费使用XOR进行相等性检查。您最好的选择通常是编写代码,以便读者清楚地了解您的意图。@Apriori您是正确的,我不想每次都打印相同的字节。但是,getc选项对于我试图实现的目标不起作用。我只是注意到了。例如,它适用于char,因为char是一个字节,但是如果我正在读取一个带有数字的文件呢?它将不再是一个字节。关于如何将数字(如int)分解为C中可能的最低数据类型,有什么想法吗?谢谢