【发布时间】:2018-10-15 02:46:31
【问题描述】:
我编写了这个方法,它比较两个文件,特别是图片,并在输出中打印差异在哪里以及差异是什么。此时的结果是每个字节都不同,但我正在比较的图像是相同的。你能帮我吗?代码如下:
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);
}
【问题讨论】:
-
c=fgetc(img1)正在从第一个文件中读取一个字节,但没有人对第二个文件执行相同的操作。不知道它是如何具体图片,虽然... -
printf也是错误的...您的缓冲区实际上只是单个字符,将地址传递给这些%s是 未定义的行为 (@987654325 @ 需要一个0-终止的字符串) -
最后,相同的图像并不意味着文件中的相同表示。有许多可能的文件格式允许不同的选项来存储图像。
-
您还必须以二进制模式打开文件,
"rb" -
嗯,如果你比较一个 128x128 纯红色正方形图像写成 JPEG,它将与一个 128x128 纯红色正方形写成 PNG、TIF 或 GIF 完全不同,所以你的方法将不能很好地用作图像比较器。更糟糕的是,如果您将保存在 PNG 文件中的 2 个纯红色矩形相互比较,它们可能仍然会有所不同,因为创建时间也保存在文件中......当然,作为学术练习,可以逐字节比较图像,但事实并非如此。