2011-01-10 17 views
3

ファイルストリームを使用してテキストファイルの先頭に何かを追加する簡単な方法はありますか?私が考えることができる唯一の方法は、ファイルをバッファにロードし、テキストを追加してバッファを書き込むことです。私はそれが私のバッファなしで行うことが可能かどうかを知りたい。Cファイルストリーム、最初に追加する

+5

"先頭に追加する"は通常「プリペンド」と呼ばれます。 – dreamlax

答えて

6

いいえ、できません。最初にテキストを挿入するには、ファイルを書き直す必要があります。

EDIT:あなたはすなわち、一時ファイルを使用する場合は、メモリにファイル全体を読んで避けることができます:

  1. 読むXが古いからバイトのファイル
  2. の先頭に挿入したい値を書きます古いファイル
  3. コピーし、古いファイルを新しいファイルを読み終わっまで
  4. が繰り返し2,3
  5. 新しいファイルにそれらのXバイトを書くファイル。
3

実際の操作は単純ではないので、簡単な方法はありません。ファイルがディスクに保存されると、ファイルの先頭より空いている空きバイトがないので、そこにデータを置くことはできません。これには理想的な汎用ソリューションはありません。通常、それは残りのすべてのデータをコピーして部屋を作るために移動させることを意味します。

したがって、Cはあなたがその問題をどのように解決したいかを決定させます。

+1

+1は「ファイルの先頭より前に空きバイトがありません」という意味です。 – Mir

0

ファイルの先頭にデータを追加する方法はありません。
質問者は、問題を解決するために考えた唯一の方法は、ファイル全体をメモリに読み込んで再度書き出すことでした。

他の方法があります。
1)既知の長さのゼロのプレースホルダを作成します。プレースホルダーのサイズを超えていない限り、ファイルハンドラーを巻き戻してこのデータを上書きすることができます。シンプルな例は、後に続く行の数を表す署名されていないintのサイズを書きますが、最後に到達するまでは書き込めず、ファイルハンドラを巻き戻して正しい値を書き直すことができます。
*注:異なるプラットフォームの 'C'のいくつかのバージョンでは、ファイルハンドラを正しく閉じるためにファイルハンドラを閉じる前に、最後にファイルハンドラをファイルの最後に配置するようにしてください。
2)新しいデータを新しいファイルに書き込み、ファイルストリームを使用して古いデータを新しいファイルに追加します。古いファイルを削除し、古いファイル名として新しいファイルの名前を変更します。コピーを使用しないでください、それは時間の無駄です。

すべての方法は、メモリサイズとCPU使用量とのトレードオフがあります。それはすべてアプリケーション要件に依存します。

0

ただ、ここでより絶対クレームの一部に対抗したかった:

ファイルの先頭にデータを追加する方法はありません。

特定の制約があると、正しくありません。

ファイルがディスクに保存されると、ファイルの先頭より空いている空きバイトがないため、そこにデータを置くことはできません。

ファイルの抽象度レベルをバイトストリームとして扱う場合があります。しかし、ファイルシステムはファイルをブロックのシーケンスとして格納することが最も多く、ファイルシステムによってはそのレベルでもう少し自由なアクセスが可能です。

のLinux 4.1以降(XFS)および4.2 +(XFS、ext4のは)あなたは、fallocateを使用してファイルに穴を挿入することを可能にする一定のオフセット/長さの制約を与えられた:一般的に

を、offsetとlenは倍数でなければなりませんファイルシステムの論理ブロックサイズは、ファイルシステムのタイプと構成によって異なります。

StackExchangeサイトの例は、 'fallocate prepend to file'を検索してWebから検索できます。