while ((c=fgetc(img1)) != EOF)
Это читает первый байт из img1
. Предполагая, что это не EOF
...
fread(&buffer1, 1,1, img1);
Это читает второй байт из img1
.
fread(&buffer2, 1,1, img2);
Это читает первый байт из img2
.
if(buffer1 != buffer2)
Итак, теперь мы сравниваем первый байт img2
со вторым байтом img1
.
Если они окажутся равными, мы снова обойдем цикл и в конечном итоге сравним второй байт img2
с четвертым байтом img1
.
Похоже, вы, возможно, подумали, что fgetc
проверил, есть ли еще один доступный байт, и что fread
затем прочитайте его. Но нет. fgetc
читает один символ из файла и затем возвращает его. Если вы напишите
c = fgetc(fp);
это почти точно так же, как если бы вы написали
fread(&c, 1, 1, fp);
Таким образом, минимальное исправление вашей программы - избавиться от
fread(&buffer1, 1,1, img1);
и измените критерий равенства на
if(c != buffer2)
Но это приводит к некоторой путанице - более поздний читатель, вероятно, задастся вопросом: «Почему один файл читается с использованием fgetc
, а другой с использованием fread
?»
Если бы я писал это, я мог бы прочитать один байт из img1
, используя getc
, и один байт из img2
, используя getc
, и сравнить их. Или я мог бы использовать fread
, чтобы прочитать N байтов из img1
в массив символов, и N байтов из img2
во второй символьный аддей, и сравнить их, используя функцию memcmp
.
Кроме того, как отметил Пол Огилви в комментарии, поскольку это двоичные файлы, когда вы вызываете fopen
, чтобы открыть их, вы должны указать режим "rb"
.