【问题标题】:Compare two files Byte by Byte逐字节比较两个文件
【发布时间】:2013-12-20 06:10:47
【问题描述】:

我有两个二进制文件,我想逐字节比较它们。为此,我想出了以下代码:

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 循环的整个长度内不断比较相同的字节。为什么这样?我在这里做错了什么?

【问题讨论】:

标签: c file comparison fread


【解决方案1】:
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;

【讨论】:

  • 那么当我想比较每个字节时如何推进文件指针? s 给你的笔记,我比较每个字节并打印一条消息,如果它们不同,ytou 到底是什么意思?
  • 确保从扩展点中删除错误pFile1+i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2021-04-27
  • 2012-06-15
  • 2016-10-23
  • 2014-08-24
  • 1970-01-01
相关资源
最近更新 更多