除非我暂停,否则程序不会结束

时间:2014-01-28 01:44:37

标签: c terminate suspend

我的程序运行应该 - 打印出适当的值,但它不会自动终止,除非我暂停(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++;
    }
}

1 个答案:

答案 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字节之间的区别。