0

次の問題について、本当に助けてください。

2つの2つのバイナリファイルからN個の整数(バイナリ形式)を読み取り、 O(nlogn)時間ですべての一般的な整数(これもバイナリ形式)を別の出力ファイルに書き込む必要があります。

これが私がやりたいことのスケッチです:

1-テキストファイルではないため、で使用できないことはわかってfscanf%dますが、各ファイルにN個の数値があることがわかっているので、「for」ループでN回実行したいと思います。

for (i=0; i<N; i++) {
    fread(&int1, 4, 1, file1);
    fread(&int2, 4, 1, file2);
    arr1[i]=int1;
    arr2[i]=int2;
} 

ここarr1で、arr2それぞれNサイズのint配列はありますか?これは正しいですか?すべての整数が4ビットで表されるN個の整数があることがわかっている場合、ファイルの最後で終了します。

qsort2-ステップで各配列をソートするために使用したいのですnlognが、まだnlognステップで2つをどのように比較する必要がありますか?私は賢い方法にたどり着きませんでした。

4

1 に答える 1

1

コードがファイルの終わりに達したときに正しく動作しないことを除いて、コードはほとんど正しいです。 freadは、最後を超えて読み取ろうとするまでEOFを検出しないため、EOFに到達した場合、またはエラーが発生した場合に備えて、戻り値をテストする必要があります。例:

if(fread(..., file1) < 1 ||
   fread(..., file2) < 1)
{
    // Error or EOF occurred
    break;
}

freadデータはバイナリであるため、ループする代わりに、1回の呼び出しで配列全体を丸呑みすることもできます。

int arr1[20], arr2[20];
if(fread(arr1, sizeof(arr1[0]), 20, file1) < 20 ||
   fread(arr2, sizeof(arr2[0]), 20, file2) < 20)
{
    // Error or early EOF occurred
}

2番目の質問では、すべての整数を1つのフラット配列に配置するだけです。これを行うには、それらを1つの配列に直接読み取るか、すべてのデータを読み取った後で1つの配列にコピーします。次にqsort、結合された配列。

于 2012-07-18T19:22:14.713 に答える