6

Cを使用してファイル(またはファイルのグループ)に標準ヘッダーを追加したい。これらのファイルは非常に大きくなる可能性があるため、メモリにロードするか、一時ファイルにコピーすることはお勧めできません(私は思います)。

ヘッダーを各ファイルに直接追加する方法はありますか?

ヘッダー自体は非常に小さく、1KB以下です。

4

2 に答える 2

10

ファイルにデータを挿入することはできません。

ただし、ファイル全体をメモリにロードする必要はありません。新しいファイルを作成し、挿入するデータを書き込んでから、元のファイルの内容を新しいファイルにコピーします(ファイル全体をメモリにロードするのではなく、ブロックごとに実行します)。

最後に、元のファイルを削除し、元のファイルと一致するように新しいファイルの名前を変更します。

これはこれを行うための最も効率的な方法であり、かなり効率的です。

于 2012-11-14T18:30:36.890 に答える
4

一時ファイルがなくても可能であるはずです。ファイルを最後からブロックごとに読み取り、各ブロックをで書き戻すことができます(original_position + header_size)。最初のブロックはで書き戻されheader_size、ヘッダー用のスペースが残ります。

しかし、あなたは本当にこれをしたくありません。中止するとファイルが破損します(ディスク容量不足、その他のI / Oエラー、電源切断など)。

したがって、実際には一時ファイルを使用する必要があります。必要なものをすべて書き込み、元のファイルの名前に名前を変更します(同じファイルシステムに一時ファイルを作成する場合は、コピーする必要があります)。

編集:私が何を意味するかを明確にするために、ファイル全体がRAMに収まるときの単純化された解決策:

  • ファイルと同じサイズのバッファを割り当てます
  • ファイルを開き、バッファに読み込みます
  • seek(file、header_size)そしてここにバッファを書き込みます
  • seek(file、0)ヘッダーを書き込む

ファイルが大きすぎる場合は、小さいバッファを割り当てて、readatおよびwriteatから開始して読み取り/書き込みを繰り返すことができfile_size - buffer_sizeますfile_size - buffer_size + header_size。次に、次のチャンクをで読み取り、file_size - 2 * buffer_sizeで書き込み、というように繰り返しfile_size - 2 * buffer_size + header_sizeます。

ただし、繰り返します。ファイルが失敗すると、ファイルが破損するリスクがあります。

于 2012-11-14T18:36:55.393 に答える