缩小C中的文件

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

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

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

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

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

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

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

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

 #include  int ftruncate(int fildes, off_t length); int truncate(const char *path, off_t length); 

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

if (ftruncate(fileno(fp), new_length) != 0) …error handling…

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

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

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

你有两个选择:

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