Fab*_*mer 1 c unix compare image file
我写了这个方法来比较两个文件,特别是图片,并在输出中打印哪里是差异和它是什么.此时此结果是每个字节与另一个字节不同,但我正在比较的图像是相同的.你能帮我吗?这是代码:
void compareFiles(char* path1, char* path2){
FILE* img1;
FILE* img2;
if((img1 = fopen(path1,"r")) == NULL || (img2 = fopen(path2,"r")) == NULL){
printf("ERROR fopen()\n");
exit(-1);
}
int i=0;
char buffer1,buffer2;
int c;
while ((c=fgetc(img1)) != EOF){
fread(&buffer1, 1,1, img1);
fread(&buffer2, 1,1, img2);
if(buffer1 != buffer2){
printf("Byte differs\n IMG1: %s, IMG2: %s; Position %d\n",&buffer1,&buffer2,i);
i++;
}
}
fclose(img1);
fclose(img2);
}
Run Code Online (Sandbox Code Playgroud)
while ((c=fgetc(img1)) != EOF)
Run Code Online (Sandbox Code Playgroud)
这将从中读取第一个字节img1.假设它不是EOF......
fread(&buffer1, 1,1, img1);
Run Code Online (Sandbox Code Playgroud)
这将从中读取第二个字节img1.
fread(&buffer2, 1,1, img2);
Run Code Online (Sandbox Code Playgroud)
这将从中读取第一个字节img2.
if(buffer1 != buffer2)
Run Code Online (Sandbox Code Playgroud)
所以现在我们将第一个字节img2与第二个字节进行比较img1.
如果它们恰好相同,我们将再次绕过循环,我们将最终比较第二个字节img2到第四个字节img1.
看起来你可能已经考虑fgetc过测试是否有另一个字节可用,fread然后读取它.但不是. fgetc从文件中读取一个字符然后返回它.如果你写
c = fgetc(fp);
Run Code Online (Sandbox Code Playgroud)
它和你写的几乎完全一样
fread(&c, 1, 1, fp);
Run Code Online (Sandbox Code Playgroud)
所以对你的程序的最小修复就是摆脱它
fread(&buffer1, 1,1, img1);
Run Code Online (Sandbox Code Playgroud)
行,并将相等测试更改为
if(c != buffer2)
Run Code Online (Sandbox Code Playgroud)
但这最终会让人感到困惑 - 后来的读者可能会怀疑,"为什么一个文件正在使用fgetc,而另一个文件正在使用fread?"
如果我写这个,我可能读一个字节img1使用getc,并从一个字节的img2使用getc,并进行比较.或者,我可能会使用fread从img1字符数组读取N个字节,从img2第二个字符adday 读取N个字节,并使用该memcmp函数进行比较.
另外,正如Paul Ogilvie在评论中提到的,由于这些是二进制文件,当你打电话fopen打开它们时,你应该指定"rb"模式.