Вопрос по comparison, c, file, fread – Сравнить два файла Byte by Byte

4

У меня есть два двоичных файла, и я хочу сравнить их побайтно. Я придумал следующий код для этого:

int CompareFiles(char *pFname1, char *pFname2)
{
    FILE      *pFile1,*pFile2;
    long      lSize1, lSize2;               // file length
    int       i=0;
    char      tmp1, tmp2;

    pFile1 = fopen(pFname1,"r");
    pFile2 = fopen(pFname2,"r");

    // obtain file size:
    fseek (pFile1 , 0 , SEEK_END);
    lSize1 = ftell (pFile1);
    rewind (pFile1);

    // obtain file size:
    fseek (pFile2 , 0 , SEEK_END);
    lSize2 = ftell (pFile2);
    rewind (pFile2);

    if (lSize1 != lSize2) {
        printf("File sizes differ, %d vs. %d\n",lSize1,lSize2);
        return ( ERROR );
    }
    for (i=0;i
Совет: используйте memcmp вместо перебора каждого байта:cplusplus.com/reference/cstring/memcmp/?kw=memcmp Ramy Al Zuhouri

Ваш Ответ

1   ответ
8
fread(&tmp1, sizeof(char), 1, pFile1+i);
fread(&tmp2, sizeof(char), 1, pFile2+i);

овать

fread(&tmp1, 1, 1, pFile1);
fread(&tmp2, 1, 1, pFile2);

вместо. Каждый звонокfread будет продвигать дескриптор файлавнутренний указатель на негосодержание файла автоматически.

Обратите внимание, что вы также регистрируете различия в содержимом файла, но не можете вернуть ошибку вызывающему коду во время вашегоfor петля.

Если вы хотите вернуться, как только обнаружите разницу, используйте

for (i=0;i<lsize1;i++) {="" fread(&tmp1,="" 1,="" pfile1);="" fread(&tmp2,="" pfile2);="" if="" (tmp1="" !="tmp2)" printf("%x:="" tmp1="" 0x%x="" 0x%x\n",i="" ,="" tmp1,="" tmp2);="" return="" (="" error="" );="" report="" to="" caller="" }="" ok="" <="" code=""></lsize1;i++)>

Если вы хотите записать все различия (это может занять много времени), используйте

<code>int err = OK;
for (i=0;i<lsize1;i++) {="" fread(&tmp1,="" 1,="" pfile1);="" fread(&tmp2,="" pfile2);="" if="" (tmp1="" !="tmp2)" printf("%x:="" tmp1="" 0x%x="" 0x%x\n",i="" ,="" tmp1,="" tmp2);="" err="ERROR;" report="" error="" to="" caller="" }="" return="" err;="" <="" code=""></lsize1;i++)></code>
@cerr I 'мы обновили мой ответ, чтобы охватить оба пункта simonc
@ До Спасибо, сейчас исправлено simonc
Итак, как мне продвинуть указатель файла тогда, когда я хочу сравнить каждый байт? Для вашей заметки, я сравниваю каждый байт и печатаю сообщение, если они различаются. Что вы конкретно имеете в виду? cerr
Убедитесь, что вы удалили эту ошибкуpFile1+i из ваших расширенных пунктов Till

Похожие вопросы