缩小C中的文件

时间:2011-03-07 16:02:07

标签: c

如何在C中收缩文件?例如,如果我打开一个2mb文件,做一些工作并决定只有1mb的文件应该仍然存在,这是如何完成的?我知道如何使用write(fd,....)来写入文件,但是如果我想在文件中间划出某些部分或截断它呢?

7 个答案:

答案 0 :(得分:6)

您可能正在寻找truncate() ftruncate()或Windows SetEndOfFile()。没有办法“剪掉”文件的一部分,你需要从前面重写它然后截断它。

答案 1 :(得分:3)

几乎每个真实系统都提供了一些截断文件的方法,但C标准没有在标准库中提供它。

这意味着您可以做的就是定义一个函数来完成工作,并为您关心的每个目标实现该功能(例如,在Windows上它将调用SetEndOfFile,在类Unix系统上它会调用ftruncate等。)

编辑:只是为了澄清:这只适用于问题的“或截断”部分。大多数文件系统都没有提供“在文件中间创建某些部分”的任何内容。如果要从文件中间删除内容,通常需要重写整个文件,或者自己处理。后者通常适用于某种类似数据库的结构,其中实际上不会从文件中间删除数据;相反,您可以创建类似索引的内容,告诉您关注的数据的位置,并在删除它们时简单地将零件标记为不再使用。如果/稍后添加数据,那么这些部分可以重新使用。在少数情况下,你将有一个“压缩”功能,它接受这样一个数据库并重写它以消除死区(但是,你又回到了重写文件)。

答案 2 :(得分:2)

如果文件足够小以适应RAM,您可以读取该文件,并仅重写必要的东西(即,读取文件,关闭文件,在写入模式下再次打开文件,写下必要的内容) , 关)。如果没有,您可以创建第二个文件,在其中写入,然后删除第一个文件并重命名第二个文件。

我的观点是,没有直接的方法可以删除中间文件的某些部分。

答案 3 :(得分:2)

如果要将文件的先前内容保留到某个长度(长度大于零),则POSIX会为作业提供truncate()和ftruncate()函数。

#include <unistd.h>
int ftruncate(int fildes, off_t length);
int truncate(const char *path, off_t length);

名称表示主要目的 - 缩短文件。但是如果指定的长度比前一个长度长,则文件会增加(零填充)到新的大小。请注意,ftruncate()适用于文件描述符,而不是您可以使用的FILE *;

if (ftruncate(fileno(fp), new_length) != 0) ...错误处理......

但是,为了您的目的,可能只需要打开截断即可。

答案 4 :(得分:2)

您有两种选择:

  1. 创建一个临时文件,将您想要的内容写入该文件,并将其重命名为原始文件
  2. 将整个文件读入内存,在内存中编辑并使用freopen重新打开文件,将其截断

答案 5 :(得分:1)

如果您有POSIX系统,请查看ftruncate()

答案 6 :(得分:1)

其他人已经回答了如何截断文件。但是,删除文件中间的部件是不可能的。为此,您需要重写整个文件。