gpt4 book ai didi

逐字节比较两个文件

转载 作者:太空狗 更新时间:2023-10-29 15:22:07 29 4
gpt4 key购买 nike

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

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

最佳答案

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;

关于逐字节比较两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20688258/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com