1

メイン メモリよりも大きいファイルの並べ替えに関する並べ替えの問題に取り組んでいます。最初のフェーズでは、サイズが元の入力ファイルと同じであるが、ローカルでソートされたサブセクションがいくつか含まれている中間ファイルを生成します。

2 番目のフェーズでは、これらのサブセクションを 1 つの並べ替えられたリストにマージします。

単一のソート済みリストを含む 3 番目のファイルを作成する代わりに、読み取り中の中間ファイルを上書きしたいと思います。

さらに、入力ストリームごとに個別の読み取りバッファーを維持したいと思います (それぞれがオフセットから中間ファイルに読み取ります)。

fopen() と fseek() を使用して、バッファリングされた複数の読み取り専用入力ストリームを作成できることはわかっています。ただし、fopen() の契約では、ファイルに対して "w" モードで呼び出すと、ファイルが既に存在する場合、ファイルのサイズがゼロに設定されると規定されています。ファイルのサイズを変更しないようにする必要があります。これは、まだ複数の場所から読み取っているためです。

fopen() & fseek() を使用してこれを達成する簡単な方法はありますか? それとも、open() を使用して、独自の読み取り/書き込みバッファリングを管理する必要がありますか?

4

3 に答える 3

2

モードでファイルを開くことができますr+。つまり、読み取りと書き込みの両方でファイルが開かれ、ファイルが切り詰められません。

于 2013-09-10T04:43:58.173 に答える
0

fopen(3)の man ページを読んでください。おそらく"r+"モードが必要です。

または、代わりにmmap(2)およびmadvise(2)<stdio.h>システムコール (関数なし) を使用することを検討してください。

于 2013-09-10T04:45:08.510 に答える