如何在C中截断文件?

sof*_*ofr 44 c file

我正在使用C将一些数据写入文件.我想删除文件中写入的先前文本,以防它比我现在写的更长.我想减小文件的大小或截断直到结束.我怎样才能做到这一点?

Jon*_*ler 71

如果要将文件的先前内容保留到某个长度(长度大于零,其他答案提供的长度),则POSIX会为作业提供truncate()ftruncate()功能.

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

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

if (ftruncate(fileno(fp), new_length) != 0) ...error handling...
Run Code Online (Sandbox Code Playgroud)

但是,您应该知道将文件stream(FILE *)和文件描述符(int)访问混合到单个文件中容易导致混淆 - 请参阅有关某些问题的注释.这应该是最后的手段.

但是,对于您的目的,可能只需要在open上截断就可以了,而为此,其他人给出的选项就足够了.


对于Windows,有一个函数SetEndOfFile()和一个相关的函数SetFileValidData()函数可以执行类似的工作,但使用不同的接口.基本上,您寻找设置文件结尾的位置,然后调用该函数.

还有一个功能,_chsize()如记录在回答通过sofr.


sof*_*ofr 23

在Windows系统中没有标题,<unistd.h>但您可以使用截断文件

 _chsize( fileno(f), size);
Run Code Online (Sandbox Code Playgroud)

  • _chsize_s for 64 bit:_chsize_s(_fileno(f),size); (5认同)
  • @AlexisWilke他确实说过“在Windows系统中”;因此,_chsize()是仅Windows功能。 (2认同)
  • `fileno()` 是[POSIX 中的标准化](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fileno.html)。微软的“弃用”充其量只是令人好奇。 (2认同)
  • 按照微软的严格解释,POSIX 和 ISO 标准是冲突的(技术上微软是对的)。前导下划线是解决冲突的一种方法。使用 POSIX 而不进行标准协调的名称调整是不推荐的。不过,世界其他地方在没有协调名称调整的情况下也过得很好,那么它真的有必要吗? (2认同)

pix*_*eat 13

这是您的操作系统的功能.标准的POSIX方法是:

open("file", O_TRUNC | O_WRONLY);
Run Code Online (Sandbox Code Playgroud)

  • 这会将文件截断为0字节的大小. (11认同)

Lan*_*son 8

如果要在某种UNIX下运行,那么这些API应该是可用的:

   #include <unistd.h>
   #include <sys/types.h>

   int truncate(const char *path, off_t length);
   int ftruncate(int fd, off_t length);
Run Code Online (Sandbox Code Playgroud)

根据我的Linux机器上的"man truncate",这些符合POSIX标准.请注意,如果传递的长度大于当前长度,这些调用实际上会增加文件的大小(!).