0

ファイル内の特定のデータを置き換えるプログラムを実行しようとしています。置換しようとしているファイルの関連部分は次のようになります。

1 Information 15e+10

2 Information 2e+16

3 Information 6e+2

等々。

問題のファイルは、数ギガバイトの範囲で非常に大きくなる可能性があり、私の理解では、ファイル全体のバッファーを使用してファイル全体を書き換えることは不可能/不合理です。値を置き換えたいだけです (例: 15e+10)。

これはすべてシンプルios::in|ios::outで正常に機能しtellp()、値を同様のサイズの値に置き換えている場合 ( 15e+10-> 12e+12)、または行の下で無視できる余分なスペースを追加するだけでサイズが小さい場合 (例15e+10-> 4e+10 ) . しかし、値をファイル内の値よりも長い値に置き換える必要がある場合 (例6e+2-> 16e+10)、改行文字を上書きするか、次の行の情報を上書きし始めると、問題が発生します。 .

フォーラムで検索したところ、ファイルを上書きするか、ファイルの最後に追加するか、ファイル全体をバッファリングして再作成することができると誰もが言っています。ファイルを再作成しなくても、値を正しく上書きするという目標を達成できる方法はありますか?

そうでない場合、問題の複数のファイルがメモリに対して大きすぎる場合、これを行うために2つのファイルを開く(1入力1出力)にはどうすればよいですか?

注:boostライブラリboost::のないシステムでこれを実行できるようにする必要があるため、使用も避けたいと思います.

4

3 に答える 3

1

入力 (IN) ファイルから読み取るストリームと、新しい出力 (tmp) ファイルに書き込む 2 番目のストリーム (OUT) を開きます。

IN から読み取り、OUT に書き込みます。置換したい値を IN から取得したら、IN から取得した値の代わりに置換を OUT に書き込みます。

解析が完了したら、最初のファイルを 2 番目の (tmp) ファイルに置き換えます。

これはうまくいきますか?

于 2013-10-08T14:04:53.533 に答える
0

ファイル内の特定の位置に「ジャンプ」するには、lseek() /fseek() を使用します。

于 2013-10-08T14:07:03.780 に答える