c++,比较两个文件是否一样?

limenglandon 2012-08-28 05:44:11
想比较两个文件的内容是否完全一样,我现在有三种想法:
1、mfc、sdk有没有现有的方法供使用,我查了msdn,好像是没有现有的方法
2、比较笨得方法:先比较文件长度,如果不等返回false;如果相等,在拷贝到内存中,用memcmp比较,如果文件比较大,而且恰好是在最后不一样,就悲剧了,所以不太想用,想到第三种方法。
3、网上有说有MD5算法,输入文件的内容,MD5处理之后得到一个字符串,然后比较这两个文件分别得到的字符串,如果相等,则返回true,否则返回false,我也比较倾向于第三种,但以前没用过,能不能帮忙用c++代码,MD5实现下这个函数。函数头如下:
输入参数两个文件的路径,输出这两个文件是否一致。
bool compfile(cstring sfile1,cstring sfile2)
{
...
...
}


谢谢!
...全文
2628 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmu_才盛 2012-09-04
  • 打赏
  • 举报
回复
线比较文件大小, 然后全盘对比。。。

或者 随即选择几个块的数据,采样对比。。。 最后全盘扫描
limenglandon 2012-09-04
  • 打赏
  • 举报
回复
大学4年,毕业3年了[Quote=引用 25 楼 的回复:]
接触编程多久了???
[/Quote]
liujun_ips 2012-09-04
  • 打赏
  • 举报
回复
compare软件Beyond
k_badboy 2012-09-04
  • 打赏
  • 举报
回复
接触编程多久了???
赵4老师 2012-09-04
  • 打赏
  • 举报
回复
system("fc /b 文件1 文件2 >result.txt");
//然后读文件result.txt的内容

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
limenglandon 2012-09-03
  • 打赏
  • 举报
回复
谢谢楼上这么多热情的回复。。。我自己也总结了一下,如果考虑效率的话,还是用文件内存映射是比较好;如果考虑到实现难以程度的话,可以调用dos命令实现;如果是想显得自己的程序稍微有点噱头的话,给用户说说显得比较有档次的话,用散列MD5实现比较好。因为我这要考虑的是长期的批量文件的比较,首要考虑性能因素,开始本来是提问求助MD5的使用的,看来还是老老实实的内存字符串比较了。[Quote=引用 21 楼 的回复:]
KISS原则:Keep It Simple and Stupid
有时候看起来很笨的方法,往往是好方法。

用MD5之类的散列算法当然是可以的,但当文件很大的时候,也需要很长时间来计算的。

俺个人推荐使用第2中方法。当然具体的做法需要思考一下,比如:
1. 内存映射。可以用操作内存的方式来操作文件。
2. 要提高效率可以使用多线程。对于大文件的比较时,尤其如此。
[/Quote]
jmppok 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
KISS原则:Keep It Simple and Stupid
有时候看起来很笨的方法,往往是好方法。

用MD5之类的散列算法当然是可以的,但当文件很大的时候,也需要很长时间来计算的。

俺个人推荐使用第2中方法。当然具体的做法需要思考一下,比如:
1. 内存映射。可以用操作内存的方式来操作文件。
2. 要提高效率可以使用多线程。对于大文件的比较时,尤其如此。
[/Quote]
同意
pathuang68 2012-09-01
  • 打赏
  • 举报
回复
KISS原则:Keep It Simple and Stupid
有时候看起来很笨的方法,往往是好方法。

用MD5之类的散列算法当然是可以的,但当文件很大的时候,也需要很长时间来计算的。

俺个人推荐使用第2中方法。当然具体的做法需要思考一下,比如:
1. 内存映射。可以用操作内存的方式来操作文件。
2. 要提高效率可以使用多线程。对于大文件的比较时,尤其如此。
「已注销」 2012-09-01
  • 打赏
  • 举报
回复
运行一下这个看结果如何
fc %SystemRoot%\system32\kernel32.dll %SystemRoot%\system32\ntdll.dll
「已注销」 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

你这样说不对,做软件不管语言不管方法怎么简单怎么来,在公司做事,是要给用户提供解决方案,不是让你练手写代码,学习是在学校的事情。顺便说下,我是做软件的,科班出身,目前title 是senior engineer,经理说我干的还不错。引用 14 楼 的回复:
引用 1 楼 的回复:

感觉做MD5,性能不优,按第二个方案实现吧。
可以文件内存映射,然后再memcmp。
一般不同的文件,……
[/Quote]
真心考虑用户么?开辟一个进程,然后读取返回值,这速度不敢恭维。fc一个1G的文件试试,而且fc文件在显示bel的时候会使主板上的喇叭响一下,如果程序差异很大,机器就会一直在响,你作为用户,你什么感觉?
在公司开发磁盘数据恢复,在工期非常紧急的情况下才用了diskpart去做分区工作,如果文档齐全我还是会按文档的方法慢慢自己实现的。
如果真可以不考虑效率问题,那么我这边程序都可以调用脚本完成,mountvol、diskcopy、format……
「已注销」 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

感觉做MD5,性能不优,按第二个方案实现吧。
可以文件内存映射,然后再memcmp。
一般不同的文件,很快就查出来了。
[/Quote]这么好的回答不用,还用dos命令,真的是做软件开发的吗?
baichi4141 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

你这样说不对,做软件不管语言不管方法怎么简单怎么来,在公司做事,是要给用户提供解决方案,不是让你练手写代码,学习是在学校的事情。顺便说下,我是做软件的,科班出身,目前title 是senior engineer,经理说我干的还不错。
[/Quote]
好厉害,膜拜
baichi4141 2012-08-31
  • 打赏
  • 举报
回复
比较两个文件是否一样,肯定要比较文件中的每一个字节
和每一个元素都相关的算法,最低时间复杂度就是O(n)的遍历

所以楼主,你想为了方便为了可靠性等等使用其他算法都可以,但要为了速度,我可以明确的说,不可能有比第二种方法更快的算法
例如你说的第三种算法,计算MD5,莫非你觉得计算MD5不需要遍历整个文件?如果不将每一个字节都纳入计算中,MD5又怎么可能被用来检测文件内容是否有改变?
limenglandon 2012-08-31
  • 打赏
  • 举报
回复
你这样说不对,做软件不管语言不管方法怎么简单怎么来,在公司做事,是要给用户提供解决方案,不是让你练手写代码,学习是在学校的事情。顺便说下,我是做软件的,科班出身,目前title 是senior engineer,经理说我干的还不错。[Quote=引用 14 楼 的回复:]
引用 1 楼 的回复:

感觉做MD5,性能不优,按第二个方案实现吧。
可以文件内存映射,然后再memcmp。
一般不同的文件,很快就查出来了。
这么好的回答不用,还用dos命令,真的是做软件开发的吗?
[/Quote]
limenglandon 2012-08-31
  • 打赏
  • 举报
回复
你这样说不对,做软件不管语言不管方法怎么简单怎么来,在公司做事,是要给用户提供解决方案,不是让你练手写代码,学习是在学校的事情。顺便说一下,文件内存映射我研究的很透了,不需要再练了。 Quote=引用 14 楼 的回复:]
引用 1 楼 的回复:

感觉做MD5,性能不优,按第二个方案实现吧。
可以文件内存映射,然后再memcmp。
一般不同的文件,很快就查出来了。
这么好的回答不用,还用dos命令,真的是做软件开发的吗?
[/Quote]
知你者我 2012-08-30
  • 打赏
  • 举报
回复
将两个文件分别以行读取,以结束符结束。然后一行行进行字符串对比。遇到不同就返回。
Gloveing 2012-08-30
  • 打赏
  • 举报
回复
Quote=引用 7 楼 的回复:]
引用 4 楼 的回复:
C/C++ code

C:\Users\ago>FC /B C:\Users\ago\Desktop\C++.bat "C:\Users\ago\Desktop\C++ - 副本
.bat"
正在比较文件 C:\USERS\AGO\DESKTOP\C++.bat 和 C:\USERS\AGO\DESKTOP\C++ - 副本.BAT

FC: 找不到差异
……
[/Quote]
既然前面我都是使用dos命令,那继续吧:
#include <windows.h>  
#include <iostream.h>
#include <stdio.h>

void main()
{
char file1[50] = "C:\\Users\\ago\\Desktop\\C++.bat";
char file2[50] = "C:\\Users\\ago\\Desktop\\C++ - 副本.bat";
char command[100] = {0};

sprintf( command, "FC /B \"%s\" \"%s\" |find \"FC: 找不到差异\" >temp.txt" , file1 , file2);
system(command);

memset(command,0,100);

FILE *file = fopen("temp.txt","r");
fread(command,1,100,file);
fclose(file);

if (command[0]=='\0')
{
cout<<"有差异"<<endl;
}
// FC: 找不到差异
cout<< command <<endl;
system("del temp.txt");

}
yh_no_code 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

感觉做MD5,性能不优,按第二个方案实现吧。
可以文件内存映射,然后再memcmp。
一般不同的文件,很快就查出来了。
[/Quote]
++
xspace_time 2012-08-30
  • 打赏
  • 举报
回复
FILE* pf = popen("FC a.txt b.txt ", "r");

while (!feof(pf))
{
char buf[100];
fread(buf, 100, pf);
printf(buf);
}
pclose(pf);
帖子不能编辑 2012-08-29
  • 打赏
  • 举报
回复
楼主说的第二种方法恰恰是最可靠的方法,你还想怎么提高性能阿?
你把两个文件看成两个很大的字符串。两个字符串作比较,时间复杂度下界是O(n)。
加载更多回复(7)

65,182

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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