以前に投稿された同様の質問に対するすべての回答を調べました C でスペースを %20 に置き換える. ただし、ハードディスク上のファイルの場合、ディスクアクセスにコストがかかり、ファイルが長すぎて一度にメモリにロードできない場合、これをどのように行うことができるか推測できません。収まる可能性がある場合は、ファイルをロードして同じ既存のファイルに書き込むことができます。さらに、メモリの制約のために、元のファイルを置き換えて、新しいファイルを作成したくない場合があります。
2 に答える
恐ろしい考え。"%20" は " " よりも長いため、ファイル内の文字を単に置き換えることはできません。その後に続くものはすべて後ろに移動する必要があります。これを既存のディスク ファイルで行う場合、これは非常に面倒で費用がかかります。
最初のパスでファイルの全体的な成長を判断してから、ブロックサイズを考慮してファイルの後ろからシフト全体を実行し、「」に遭遇したときにシフトを調整することができます。しかし、私が言ったように - 面倒です。それが明確な義務でない限り、あなたは本当にそれをしたくありません。
ファイルを読み取り、置換を行い、新しいファイルに書き込み、新しいファイルの名前を古いファイルに上書きします。
編集: 副作用として、実行中にプログラムが終了しても、半分変換されたファイルにはなりません。これが実際には、多くのプログラムが必要がない場合でも新しいファイルに書き込む理由です。ファイルが「常に」正しいことを確認するためです。新しいファイルは、古いファイルが正常に書き込まれた後にのみ置き換えられるためです。これは、システム障害を考慮しない単純なトランザクション スキームですが、アプリケーション障害 (ユーザーによるプログラムの強制終了を含む) にはうまく機能します。
置換部分については、2 つのバッファーを使用できます。1 つは読み取り用で、もう 1 つは変換された文字列を書き込み、ディスクに書き込みます。メモリの制約によっては、小さな入力バッファ (たとえば 1KiB) でも十分です。ただし、再割り当ての繰り返しを避けるために、出力用に固定バッファーを保持し、入力バッファーの 3 倍のサイズにすることができます (最悪の場合、入力はすべてスペースです)。合計 4KiB のメモリに、OS が使用するバッファを加えたものです。ディスク ブロック サイズの倍数を入力サイズとして使用することをお勧めします。
問題は、同じファイルへの読み取りと書き込みの要件です。残念ながら、これは不可能です。文字単位で読み取る場合、スペースに到達したときに何が起こるかを考えてみてください。ファイル内で 3 文字を書き、次の 2 文字を上書きする必要があります。正確にはあなたが望むものではありません。