2013-12-19 2 views
3

두 개의 이진 파일이 있는데이를 Byte By Byte로 비교하려고합니다. 나는 그렇게 할 수있는 다음 코드를 내놓았다 :두 파일 비교 Byte Byte

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<lSize1;i++) { 
     fread(&tmp1, sizeof(char), 1, pFile1+i); 
     fread(&tmp2, sizeof(char), 1, pFile2+i); 
     if (tmp1 != tmp2) { 
      printf("%x: tmp1 0x%x != tmp2 0x%x\n",i , tmp1, tmp2); 
     } 
    } 
    return (OK); 
} 

을하지만 어떤 이유로, 그것은 진행되지 않는 파일의 포인터처럼 보이는 그것은 전체 길이 서로 동일한 바이트를 비교 유지 for 루프. 왜 그렇게? 여기서 내가 뭘 잘못하고 있니?

+0

팁을 사용 : 각 바이트를 반복하는 대신 memcmp를 사용하십시오. http://www.cplusplus.com/reference/cstring/memcmp/?kw=memcmp –

답변

7
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, 1, pFile1); 
    fread(&tmp2, 1, 1, pFile2); 
    if (tmp1 != tmp2) { 
     printf("%x: tmp1 0x%x != tmp2 0x%x\n",i , tmp1, tmp2); 
     return (ERROR); // report error to caller 
    } 
} 
return (OK); 

를 사용하여 (이것은 잠재적으로 매우 많은 시간이 소요됩니다)

int err = OK; 
for (i=0;i<lSize1;i++) { 
    fread(&tmp1, 1, 1, pFile1); 
    fread(&tmp2, 1, 1, pFile2); 
    if (tmp1 != tmp2) { 
     printf("%x: tmp1 0x%x != tmp2 0x%x\n",i , tmp1, tmp2); 
     err = ERROR; // report error to caller 
    } 
} 
return err; 
+0

그래서 각 바이트를 비교할 때 파일 포인터를 어떻게 전진시킬 수 있습니까? 당신의 메모를 위해, 나는 각 바이트를 비교하고 그들이 다른 경우 메시지를 출력합니다. 정확히 무엇을 의미합니까? – cerr

+0

@cerr 두 점을 모두 커버하기 위해 답변을 업데이트했습니다 – simonc

+1

연장 점에서 'pFile1 + i' 오류를 제거했는지 확인하십시오 – Till

관련 문제