是否有一种简单的方法可以使用文件流在文本文件的开头附加内容?因为我能想到的唯一方法是将文件加载到缓冲区中,写入text-to-append然后写入缓冲区。我想知道是否有可能在没有缓冲区的情况下进行。
答案 0 :(得分:7)
不,不可能。您必须重写文件以在开头插入文本。
编辑:如果使用临时文件,则可以避免将整个文件读入内存,例如:
答案 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'找到。