比较Byte的两个Byte文件

 zhouwenjun 发布于 2023-02-09 10:26

我有两个二进制文件,我想比较Byte by 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

但由于某种原因,它看起来像文件中的指针没有前进,并且它在for循环的整个长度上保持相互比较相同的字节.为什么这样?我在这做错了什么?

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;
    

    2023-02-09 10:29 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有