2014-01-28 5 views
0

Моя программа работает так, как должна - печатает соответствующие значения, но она не будет завершена автоматически, если я не приостановил (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

Мы можем предположить, что это c или C++, но вы не упомянули об этом. пожалуйста, используйте тег –

+0

извините, исправление его .... –

ответ

1

fgetc возвращает int, а не символ без знака. EOF также является int. Измените ch1 и ch2 на ints, и он должен работать.

Что происходит, так это то, что fgetc возвращает -1 (значение EOF), но вы набиваете его в unsigned char, получая только 8 бит (все 1). Затем, чтобы сравнить это значение с EOF, unsigned char распространяется на int путем добавления 0 влево. Это не будет равно EOF, поэтому он никогда не останавливается.

Немного больше:

В 32 бита, -1 0xFFFFFFFF. Наложение этого на знак без знака (или подписанный) дает 0xFF. Когда он расширен для сравнения, поскольку он является символом unsigned, он расширяется, как и этот 0x000000FF, который не равен 0xFFFFFFFF. Обозначенный символ будет расширен до 0xFFFFFFFF, но по-прежнему не рекомендуется использовать символ с тех пор, пока вы не можете определить разницу между конечным файлом и байтом 0xFF.

+0

thx, он работал, и я понимаю. –

+0

Затем выберите ответ и дайте мне сладкую репутацию! – ooga

+0

Я до сих пор не знала галочку, и я не могу сообщить вам, что у меня нет 15 пунктов ответа. –