我的程序运行应该 - 打印出适当的值,但它不会自动终止,除非我暂停(ctrl z)它?问题出在哪里?
void compare_two_binary_files(FILE *f1, FILE *f2)
{
unsigned char ch1, ch2;
int flag = 0;
int count = 0;
while (((ch1 = fgetc(f1)) != EOF) &&((ch2 = fgetc(f2)) != EOF)){
if (ch1 != ch2){
printf("Byte pos where two files differ is: %d\n", count + 1);
printf("byte value of file 1: %o\n", ch1);
printf("byte value of file 2: %o\n", ch2);
}
count++;
}
}
答案 0 :(得分:1)
fgetc返回一个int,而不是一个unsigned char。 EOF也是一个int。将ch1和ch2更改为整数,它应该可以工作。
发生的事情是fgetc返回-1(EOF的值),但是你将它填充到unsigned char中,只得到低8位(全1)。然后,为了将此值与EOF进行比较,通过在左侧添加0来将unsigned char扩展为int。这不等于EOF,所以它永远不会停止。
再多一点:
在32位中,-1为0xFFFFFFFF。将其填充到无符号(或带符号)的char中会产生0xFF。当它被扩展用于比较时,因为它是一个无符号字符,所以它扩展为0x000000FF,它不等于0xFFFFFFFF。一个有符号的char将扩展为0xFFFFFFFF,但是使用char仍然不是一个好主意,因为你不能分辨文件结束标记和0xFF字节之间的区别。