如何对两个二进制文件进行比较?

easthg 2004-09-22 05:11:39
我的实现思路如下:
1) 获取文件的大小,申请内存空间.
2) 获取指针(char *)
3) 调用memcmp()进行比较.
而我打开一个文件进行比较,程序出现异常而死掉!
如何对两个二进制文件进行比较?
...全文
370 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjy1001 2004-09-22
  • 打赏
  • 举报
回复
//返回1表示相同,否则表示不同
#include <stdio.h>
bool FileCMP(char *fName0, *fName1)
{
FILE *fp0, *fp1;
char *fbuf0, *fbuf1;
int liv_fsize0, liv_fsize1;

fp0 = fopen (fName0, "rb");
if (!fp0)
{
return 0;
}

fp1 = fopen (fName1, "rb");
if (!fp1)
{
return 0;
}

fseek(fp0, 0, SEEK_END);
liv_fsize0 = ftell(fp0);
fseek(fp0, 0, SEEK_SET);


fseek(fp1, 0, SEEK_END);
liv_fsize1 = ftell(fp1);
fseek(fp1, 0, SEEK_SET);

if (liv_fsize0 != liv_fsize1)
{
return 0;
}

fbuf0 = new char[liv_fsize0 + 1];
fbuf1 = new char[liv_fsize1 + 1];

fread(fbuf0, 1, liv_fsize0, fp0);
fread(fbuf0, 1, liv_fsize0, fp0);

fclose(fp0);
fclose(fp1);

for (int i = 0; i < liv_fsize0; i++)
{
if (fbuf0[i] != fbuf1[i])
{
delete[] fbuf0;
delete[] fbuf1;
return 0;
}
}

delete[] fbuf0;
delete[] fbuf1;
return 1;
}

临时写的代码,没调试,应该很容易调试出来的
easthg 2004-09-22
  • 打赏
  • 举报
回复
GetFileContent(char *buf,int m_iFileIndex)
{
/*
char * buf : 应该是指向 GlobalAlloc() 所分配的内存空间.
*/
// 判断是否已经分配空间.
if(IsOpen())
{
int m_iFileCount = GetFileNumber();
if((m_iFileIndex+1)<=m_iFileCount)
{
//hGlobal = GlobalReAlloc(hGlobal,lnewHeadSize+lnewBodySize,GMEM_MOVEABLE|GMEM_ZEROINIT);
HGLOBAL hGolTmp = GlobalHandle(buf);
unsigned long l = GetSpecialFileSize(m_iFileIndex);
hGolTmp = GlobalReAlloc(hGolTmp,l,GMEM_MOVEABLE|GMEM_ZEROINIT);
buf = (char*)GlobalLock(hGolTmp);
// 得到偏移地址.
int m_iadd = atoi(GetMemoryAreaData(m_p + Extra_Info_Size + File_Unit_Size*m_iFileIndex + File_Type + File_Name,File_Address));
if(m_iadd<=0)
return FALSE;
memcpy(buf,m_p + m_iadd,l);
GlobalUnlock(hGolTmp);
return TRUE;
}
else
return FALSE;
}
return FALSE;
}
easthg 2004-09-22
  • 打赏
  • 举报
回复
其中hFirst ,hSecond 在GetFileContent()函数中做了调整了。
easthg 2004-09-22
  • 打赏
  • 举报
回复
HGLOBAL hFirst,hSecond;
char *m_pFirst;
char *m_pSecond;
hFirst = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,1);
hSecond= ::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,1);
m_pFirst = (char*)::GlobalLock(hFirst);
m_pSecond= (char*)::GlobalLock(hSecond);
mmsFirst.GetFileContent(m_pFirst,i);(读数据到m_pFirst中,其中是以(char*))
mmsSecond.GetFileContent(m_pSecond,i);
result = memcmp(m_pFirst,m_pSecond,firstSize);//死掉的地方.




kpld8888 2004-09-22
  • 打赏
  • 举报
回复
用fopen打开试试?
DentistryDoctor 2004-09-22
  • 打赏
  • 举报
回复
思中和没问题,可能是内存操作不当吧。代码!
  • 打赏
  • 举报
回复
请给出代码!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧