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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM