比较两个文件逐字节

编程入门 行业动态 更新时间:2024-10-27 14:21:02
本文介绍了比较两个文件逐字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有两个二进制文件,我想通过字节来比较它们字节。我想出了以下code这样做的:

INT CompareFiles(字符* pFname1,字符* pFname2){    FILE * pFile1,* pFile2;    长lSize1,lSize2; //文件长度    INT I = 0;    焦炭TMP1,TMP2;    pFile1 = FOPEN(pFname1,R);    pFile2 = FOPEN(pFname2,R);    //获得文件大小:    fseek的(pFile1,0,SEEK_END);    lSize1 = FTELL(pFile1);    倒带(pFile1);    //获得文件大小:    fseek的(pFile2,0,SEEK_END);    lSize2 = FTELL(pFile2);    倒带(pFile2);    如果(lSize1!= lSize2){        的printf(文件大小不同,%d个主场迎战%d个\\ N,lSize1,lSize2);        返回(ERROR);    }    对于(i = 0; I< lSize1;我++){        FREAD(安培; TMP1,sizeof的(炭),1,pFile1 + I);        FREAD(安培; TMP2,sizeof的(炭),1,pFile2 + I);        如果(TMP1!= TMP2){            的printf(%!X:TMP1了0x%X = TMP2为0x%X \\ n,我,TMP1,TMP2);        }    }    回报(OK);}

但由于某些原因,它看起来像在文件中的指针不前进,它保持了整个长度比较相同的字节彼此为循环。为什么这样?我在做什么错在这里?

解决方案

FREAD(安培; TMP1,sizeof的(炭),1,pFile1 + I);FREAD(安培; TMP2,sizeof的(炭),1,pFile2 + I);

时,改变文件句柄循环的每次迭代。您应该使用

FREAD(安培; TMP1,1,1,pFile1);的fread(安培; TMP2,1,1,pFile2);

来代替。到 FREAD 每次通话将推动文件句柄的内部指针,它会自动的文件内容。

请注意,您也登录文件内容的差异,但未能将错误返回到你的为循环中调用code。

如果你想,只要​​你遇到不同的回报,用

为(i = 0; I< lSize1;我++){    的fread(安培; TMP1,1,1,pFile1);    的fread(安培; TMP2,1,1,pFile2);    如果(TMP1!= TMP2){        的printf(%!X:TMP1了0x%X = TMP2为0x%X \\ n,我,TMP1,TMP2);        返回(ERROR); //报告错误给调用者    }}回报(OK);

如果你想记录所有的差异(这将是可能非常耗时),用

INT ERR = OK;对于(i = 0; I< lSize1;我++){    的fread(安培; TMP1,1,1,pFile1);    的fread(安培; TMP2,1,1,pFile2);    如果(TMP1!= TMP2){        的printf(%!X:TMP1了0x%X = TMP2为0x%X \\ n,我,TMP1,TMP2);        ERR =错误; //报告错误给调用者    }}返回ERR;

I have two binary files and I want to compare them Byte by Byte. I came up with the following code to do so:

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 ); }

But for some reason, it looks like the pointer in the file doesn't advance and it keeps comparing the same Bytes to each other for the whole length of the for loop. Why so? What am I doing wrong here?

解决方案

fread(&tmp1, sizeof(char), 1, pFile1+i); fread(&tmp2, sizeof(char), 1, pFile2+i);

is changing the file handle for each iteration of the loop. You should use

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

instead. Each call to fread will advance the file handle's internal pointer to it's file content automatically.

Note that you also log differences in file content but fail to return an error to calling code during your for loop.

If you want to return as soon as you encounter a difference, use

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 );

If you want to log all differences (this will be potentially very time consuming), use

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-10-22 09:17:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1517092.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:两个   文件

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!