2009-07-20 33 views
15

ファイルの特定の行を削除し、その行の特定の部分が指定された文字列と一致するかどうかに基づいて、同じファイルに特定の行を挿入します。一時ファイルを使用せずにコンテンツをコピーするなどの方法がありますか?C言語のファイルから行を削除する

答えて

27

問題は、ファイルが(基本的に)ディスク上のバイトの配列(または他の物理的な基盤と同じですが、とにかくバイト)であり、 "a"はさまざまなバイト数を取ることができます。行を挿入したり削除したりするには(常に行を厳密に同じ長さの別の行と置き換える場合を除いて)、ファイルの残りの部分をすべて「上に」または「下に」シフトする必要があります...これは非常に厄介な操作です(ファイルの最初に向かって1行の長さを1バイトだけ変更しても、ファイルの残りはギガバイトになる可能性があります)。

そのような操作は信じられないほど厄介なものである可能性があります。したがって、可変長(C、Python、Java、C++、Ruby、または他の言語など)のファイルをサポートするANY言語では、パフォーマンスやリスクに潜在的に影響を与える可能性のあるこのようなコストを本当に支払う必要はほとんどありません(GBやデータの「シフト」中のシステムやディスクのクラッシュがあなたの全体の巨大なファイルの有用性を破壊する可能性があります)。あなたが避けようとしている、完全にシンプルで、適切で、速く、安全で、合理的なテクニックは、基本的にゼロ点があります(それは避けようとしているのですか?

結果ファイルをソースファイル(通常は同じファイルシステム内にある場合はほとんどのシステムのアトミック操作)でmvしたときに、ソースファイルとは異なる結果ファイルを使用します。すべての可能な世界の最高。

3

ファイルの一部を適切に「切り取る」ことはできません。あなたはいつもどこかに一時的なコピーを作成します。これはCのことではありません。それはどんな言語にも当てはまります。

あなたはファイルをmmapとすることができます。その後、消去したい行が見つかると、その行の後ろのすべてを行頭に置くことができます。私はそれがいかに効率的であろうと疑問に思います。一時ファイルがより速くなる可能性があります。

+0

の上に追加する必要があります一時ファイルはたくさん*安全です*。 – RBerteig

+0

これは私の最初の選択ではないでしょう。私が考えることができるのは、その要求を満たすかもしれない唯一のものです。このアプローチは間違いなく安全です(一時的なファイルのアクセス権の問題はありません)。しかし、何らかの障害が発生した場合にファイルが破損することに同意します。 –

0

ファイルがRAM上で処理するのに十分でない場合は、リンクされたリストのノードである各ノードがラインを表すリンクされた文字列リストを使用することができます。 '\ n'必要に応じてリンクされたリストの挿入操作や削除操作を実行し、リンクされたリストを使用して同じファイルを上書きすることができます。

たとえば、mytext。

TXTこれはテストファイル

ラインである

の上に追加する必要があります。この行は、あなたが上記のファイルのリンクリストを作成するときに今

を削除する必要がありますそれはのようになります

[これはテストファイルです] - > [上の行を追加する] - > [この行[> - [これは新しいラインです]> - > [NULL]

挿入操作は[これは]テストファイルである

にリンクされているリストを変更します - ]を削除する必要がありますライン]上に追加する必要があります - > [この行]を削除する必要がある - ] NULL [>

操作は

にリンクされているリストを変更します削除[これはテストファイルです] - > [ティ[新しい行です] - > [上の行を追加する必要があります] - > [NULL]

リンクされたリストをmytext.txtファイルに書き込むことができます。最後に '\ n'すべてのノードの

は、最終的なファイルは、

をmytext.txtされるだろうこれはテストファイルである

これは新しいラインです

ライン

関連する問題