C++文件逐字节对比

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

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

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

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

bool compfile(ifstream& in1, ifstream& in2){
     ifstream::pos_type size1, size2;
     size1 = in1.seekg(0, ifstream::end).tellg();
     in1.seekg(0, ifstream::beg);
     size2 = in2.seekg(0, ifstream::end).tellg();
     in2.seekg(0, 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(0 != memcmp(buffer1, buffer2, size))
             return false;
         remaining -= size;
     }
     return true;
}

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。