C文件流,在开头附加

时间:2011-01-10 22:53:55

标签: c file stream append

是否有一种简单的方法可以使用文件流在文本文件的开头附加内容?因为我能想到的唯一方法是将文件加载到缓冲区中,写入text-to-append然后写入缓冲区。我想知道是否有可能在没有缓冲区的情况下进行。

4 个答案:

答案 0 :(得分:7)

不,不可能。您必须重写文件以在开头插入文本。

编辑:如果使用临时文件,则可以避免将整个文件读入内存,例如:

  1. 将要插入的值写入文件的开头
  2. 从旧文件中读取X字节
  3. 将这些X字节写入新文件
  4. 重复2,3,直到您完成阅读旧文件
  5. 将新文件复制到旧文件。

答案 1 :(得分:3)

没有简单的方法,因为实际操作并不简单。当文件存储在磁盘上时,在文件开头之前没有空的可用字节,因此您不能只将数据放在那里。对此没有理想的通用解决方案 - 通常,它意味着复制所有其余数据以移动它以腾出空间。

因此,C让你决定如何解决这个问题。

答案 2 :(得分:1)

无法将数据附加到文件的开头 提问者还说,他们想到解决问题的唯一方法是将整个文件读入内存并再次写出来。

以下是其他方法 1)写一个已知长度的零占位符。只要不超出占位符大小,就可以回退文件处理程序并写入此数据。一个简单的例子是在开始时写一个unsigned int的大小,表示将跟随的行数,但是在你到达结尾之前将无法填写,并且可以倒回文件处理程序并重写正确的值。 br /> *注意:不同平台上的某些版本的“C”坚持最终将文件处理程序放在文件末尾,然后关闭文件处理程序以使其正常工作。
2)将新数据写入新文件,然后使用文件流将旧数据附加到新文件。删除旧文件,然后将新文件重命名为旧文件名。不要使用副本,这是浪费时间。

所有方法都有磁盘大小与内存和CPU使用率的权衡。这一切都取决于您的应用要求。

答案 3 :(得分:1)

只是想在这里反驳一些更绝对的主张:

  

无法将数据附加到文件的开头。

在给定某些限制条件的情况下,存在错误。

  

当文件存储在磁盘上时,文件开头之前没有空的可用字节,因此您不能只将数据放在那里。

在将文件的抽象级别作为字节流进行处理时可能就是这种情况。但是,文件系统通常将文件存储为一系列块,而某些文件系统允许在该级别进行更多的免费访问。

Linux 4.1+(XFS)和4.2+(XFS,ext4)允许您使用fallocate在文件中插入空洞,给定某些偏移/长度约束:

  

通常,offset和len必须是文件系统逻辑块大小的倍数,这取决于文件系统类型和配置。

StackExchange网站上的示例可以通过网络搜索'fallocate prepend to file'找到。