6

我想使用 C 向文件(或文件组)添加标准头。这些文件可能非常大,因此将它们加载到内存中或将它们复制到临时文件中(我认为)是个坏主意。

有没有办法简单地将标题直接添加到每个文件?

标头本身很小,不超过 1 KB

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) 写入头部

file_size - buffer_size如果文件太大,您可以分配较小的缓冲区并从 read at和 write at开始重复读/写file_size - buffer_size + header_size。然后重复下一个块在 处读取,在 处file_size - 2 * buffer_size写入file_size - 2 * buffer_size + header_size,依此类推。

但让我重复一遍:如果文件失败,您可能会损坏文件!

于 2012-11-14T18:36:55.393 回答