C++ファイルをバイト単位で比較
2701 ワード
OIerとして、追い詰める腕は欠かせない.最近、自分のCPPのレベルを示すために、学生たちのためにCenaを作った(もちろん、コマンドラインインタフェース、ミニ).しかし、ファイル対比という最も重要な一環で引っかかってしまった.
いろいろ考えましたが、まず思いついたのはC++の各ライブラリにファイルコントラスト関数を要求することですが、いくらひっくり返しても、ありません.強引なふりをしている以上、MD 5の対比という奥深い解決策を考えました.しかし、いくつかのマトリクス出力など、ファイルが大きくなります.それは運行して1カード1カード(今度詰めた時にカードをどうしますか)で、そこでやはりもっと良い方法を考えます.
ここで、私は最も愚かな方法が最も役に立つことを体得しました.私は2つのifstream変数を使って、バイナリで開き、まず2つのファイルの長さを比較し、FALSEに直接戻るのを待たない.等しい場合は、メモリにコピーします.出力エラー後,大きさが正解と等しくなることは困難であるため,このアルゴリズムは多くのデータで最適である.答えがACであっても出力は1つ程度大きくないのでカートン現象はありません.
プログラムに進み、まず関数を見ます.
2つのパラメータを参照形式で読み込み、速度を節約します.size 1,size 2は2つのファイルのサイズを表す.待たなければ、そのままFALSEに戻ります.等しければ、すなわち比較が開始され、1つのブロックのサイズ(BLOCKSIZE)が4096バイトに設定される.ペアのバイトはremainingからremainingが0になるまで減算されます.本当に待たなければtrueに戻ります.
いろいろ考えましたが、まず思いついたのはC++の各ライブラリにファイルコントラスト関数を要求することですが、いくらひっくり返しても、ありません.強引なふりをしている以上、MD 5の対比という奥深い解決策を考えました.しかし、いくつかのマトリクス出力など、ファイルが大きくなります.それは運行して1カード1カード(今度詰めた時にカードをどうしますか)で、そこでやはりもっと良い方法を考えます.
ここで、私は最も愚かな方法が最も役に立つことを体得しました.私は2つのifstream変数を使って、バイナリで開き、まず2つのファイルの長さを比較し、FALSEに直接戻るのを待たない.等しい場合は、メモリにコピーします.出力エラー後,大きさが正解と等しくなることは困難であるため,このアルゴリズムは多くのデータで最適である.答えがACであっても出力は1つ程度大きくないのでカートン現象はありません.
プログラムに進み、まず関数を見ます.
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;
}
2つのパラメータを参照形式で読み込み、速度を節約します.size 1,size 2は2つのファイルのサイズを表す.待たなければ、そのままFALSEに戻ります.等しければ、すなわち比較が開始され、1つのブロックのサイズ(BLOCKSIZE)が4096バイトに設定される.ペアのバイトはremainingからremainingが0になるまで減算されます.本当に待たなければtrueに戻ります.