我有两个二进制文件,我想比较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
循环的整个长度上保持相互比较相同的字节.为什么这样?我在这做错了什么?
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;