如何在C中截断文件?

时间:2009-05-16 22:28:29

标签: c file

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

6 个答案:

答案 0 :(得分:67)

如果要将文件的先前内容保留一定长度(长度大于零,其他答案提供),则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...

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

但是,为了您的目的,可能只需要打开截断即可,为此,其他人提供的选项就足够了。


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

answer sofr中记录了一个_chsize()函数。

答案 1 :(得分:22)

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

截断文件
 _chsize( fileno(f), size);

答案 2 :(得分:12)

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

open("file", O_TRUNC | O_WRONLY);

答案 3 :(得分:6)

如果要在某种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标准。请注意,如果传递的长度大于当前长度,这些调用实际上会增加文件的大小(!)。

答案 4 :(得分:3)

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

截断整个文件:

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.

答案 5 :(得分:2)

<强>&LT;编辑&gt;

啊,你编辑了你的帖子,你正在使用C.当你打开文件时,用“w +”这样的模式打开它,它将截断它准备写:

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

<强>&LT; /编辑&gt;

要在C ++中截断文件,您只需创建一个文件的ofstream对象,使用 ios_base :: trunc 作为文件模式来截断它,如下所示:

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