如何在C中截断文件?

我使用C来将一些数据写入文件。 我想擦除写在文件中的以前的文本,以防它比我现在写的更长。 我想减小文件的大小或截断,直到结束。 我该怎么做?

如果你想保存文件的以前的内容达到一定的长度(一个大于零的长度,其他答案提供),那么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) ...error handling... 

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

不过,为了达到你的目的,你可能需要截断公开,为此,其他人提供的选项就足够了。

在Windows系统中,没有头<unistd.h>但是可以通过使用截断文件

  _chsize( fileno(f), size); 

这是你的操作系统的一个function。 标准的POSIX方法是:

 open("file", O_TRUNC | O_WRONLY); 

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

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

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

如果你想截断整个文件,打开文件写作为你做。 否则,您必须打开文件进行读取,并将要保留的文件的各个部分读入临时variables,然后将其输出到任何需要的位置。

截断整个文件:

 FILE *file = fopen("filename.txt", "w"); //automatically clears the entire file for you. 

截断文件的一部分:

 FILE *inFile("filename.txt", "r"); //read in the data you want to keep fclose(inFile); FILE *outFile("filename.txt", "w"); //output back the data you want to keep into the file, or what you want to output. 

<编辑>

嗯,你编辑了你的文章,你正在使用C.当你打开文件时,打开它的模式“w +”就像这样,它会截断准备写作:

 FILE* f = fopen("C:\\gabehabe.txt", "w+"); fclose(file); 

</编辑>

要用C ++截断文件,只需使用ios_base :: trunc作为文件模式截断文件,就可以简单地为文件创build一个ofstream对象,如下所示:

 ofstream x("C:\\gabehabe.txt", ios_base::trunc);