作为一个OIer,装逼的本事是必不可少的。最近,为了展示自己CPP水平,为同学们做了一个Cena(当然,命令行界面,很迷你)。但是,却在文件对比这个最重要的环节卡住了。

我想了很多办法,首先想到的就是向C++的各种库里要文件对比函数,但是无论怎么翻,都没有。既然装逼,那么我就想到了一个看起来深奥的解决方法:MD5对比。但是,文件一大,如一些矩阵输出什么的。它运行起来就一卡一卡的(下次装逼时卡了怎么办),于是还是想个更好的办法。

在这里,我体会到了,最笨的办法却恰恰是最有用的。我用两个ifstream变量,以二进制方法打开,首先比较两文件的长度,不等直接返回FALSE。如果相等,则拷贝到内存中。由于输出错误后,大小很难与正确答案相等,所以这个算法在大多数数据下是最优的。即使答案是AC的,输出也不会大到一种程度,所以没有卡顿现象。

现在上程序,首先看函数:

bool compfile(ifstream& in1, ifstream& in2){
ifstream::pos_type size1, size2;
size1 = in1.seekg(, ifstream::end).tellg();
in1.seekg(, ifstream::beg);
size2 = in2.seekg(, ifstream::end).tellg();
in2.seekg(, ifstream::beg);
if(size1 != size2)
return false;
size_t remaining = size1;//or size2
while(remaining)
{
char buffer1[BLOCKSIZE], buffer2[BLOCKSIZE];//BOLCKSIZE=4096
size_t size = min(BLOCKSIZE, remaining);
in1.read(buffer1, size);
in2.read(buffer2, size);
if( != memcmp(buffer1, buffer2, size))
return false;
remaining -= size;
}
return true;
}

以引用形式读入两个参数,以节省速度。size1,size2表示两个文件的大小。如果不等了,直接返回FALSE。若相等,即开始比对,一个块的大小(BLOCKSIZE)被设置为4096字节。比对的字节从remaining中减去,直到remaining为0。如果真的不等,才返回true。

最新文章

  1. 爬虫4 html输出器 html_outputer.py
  2. java课后作业6
  3. MVC模型
  4. 利用ClouderaManager启动HBase时,出现 master.TableNamespaceManager: Namespace table not found. Creating...
  5. Android利用数据库传送数据
  6. Android自动检测版本及自动升级
  7. LintCode "Coins in a Line II" !
  8. LeetCode(3) - Longest Substring Without Repeating Characters
  9. [mac git 服务器端]
  10. WebRTC clientICE 延迟问题
  11. Unity3D中使用MiniJson解析json的例子
  12. [LeetCode] Valid Tic-Tac-Toe State 验证井字棋状态
  13. python数学第四天【古典概型】
  14. python中type、object与class之间关系(一切皆对象)
  15. js selection对象使用方法
  16. Could not find class com.google.gson.Gson
  17. Java多线程编程中Future模式的详解<转>
  18. java Arrays.asList 问题
  19. JVM学习笔记(一):Java内存区域
  20. ssm+PageHelper实现分页查询

热门文章

  1. IIS7 性能(内存、CPU、当前请求耗时)监测
  2. 待修改 nyoj 412 又是一个遗留问题
  3. POJ 1458 Common Subsequence 最长公共子序列 LCS
  4. zookeeper系列(一)安装
  5. 算法导论学习-heapsort
  6. Dynamices CRM JS 类库 神器 XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library
  7. 在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便。通过安装VirtualBox提供的“增强功能组件”,-摘自网络
  8. ssh-copy-id password
  9. HDU 3392 Pie(DP)
  10. hdu 4635 Strongly connected(Tarjan)