2013-12-19 55 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

那么我如何提前指定文件指针,然后当我想比较每个字节? s为您的笔记,我比较每个字节和打印一条消息,如果他们不同,你的意思是什么? – cerr

+0

@cerr我已经更新了我的答案,涵盖了两点 – simonc

+1

确保你从扩展点删除了错误'pFile1 + i' – Till