我正在使用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()
函数可以执行类似的工作,但使用不同的接口.基本上,您寻找设置文件结尾的位置,然后调用该函数.
sof*_*ofr 23
在Windows系统中没有标题,<unistd.h>
但您可以使用截断文件
_chsize( fileno(f), size);
Run Code Online (Sandbox Code Playgroud)
pix*_*eat 13
这是您的操作系统的功能.标准的POSIX方法是:
open("file", O_TRUNC | O_WRONLY);
Run Code Online (Sandbox Code Playgroud)
如果要在某种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标准.请注意,如果传递的长度大于当前长度,这些调用实际上会增加文件的大小(!).