我正在使用C将一些数据写入文件。我想删除文件中写入的先前文本,以防它比我现在写的更长。 我想减小文件的大小或截断直到结束。我怎么能这样做?
答案 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()
函数可以执行类似的工作,但使用不同的接口。基本上,您寻找设置文件结尾的位置,然后调用该函数。
答案 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);