在fd
类型中给出参数FILE*
,例如:
FILE* fd = fopen("a.txt","w")
。
如何删除a.txt
中所有写入的文字?
注意:我不知道该文件的名称是什么(我正在编写一个函数,该函数以FILE*
的类型获得某人已在主要文件中打开的参数。)
例如:
FILE* fd = fopen("a.txt","w");
assert(fd != NULL); // it's not important for this question.
fprintf(fd,"hello1\n");
fprintf(fd,"hello2\n");
//.... and now I want to remove all the text from a.txt. How can I do it?
// The cleaning will be in other function that get just fd (without the
// name of the file)
fclose(fd);
答案 0 :(得分:1)
您可以使用write
标记
fopen(filename, "w")
如果文件已存在,文件将被新的空文件覆盖。
答案 1 :(得分:1)
您可以在除Windows以外的大多数系统上使用ftruncate
。 Windows具有_chsize
功能。你必须做一些预处理器检查:
#ifdef _WIN32
#include <io.h>
#else
#include <sys/types.h>
#include <unistd.h>
#endif
int truncate_file(FILE *fp);
#ifdef _WIN32
int truncate_file(FILE *fp) {
return _chsize(_fileno(fp), 0);
}
#else
int truncate_file(FILE *fp) {
return ftruncate(fileno(fp), 0);
}
#endif
我不确定这在Cygwin或MinGW上是否完全正确。
但是,如果您想编写干净,可移植的代码而不使用预处理器,您唯一的选择是重新打开文件:
FILE *fp;
...
fclose(fp);
fp = fopen(filename, "w");
fclose(fp);
答案 2 :(得分:1)
答案 3 :(得分:1)
关闭并重新打开文件(如Kira Sama's answer中所述),或者,POSIX系统上的 使用truncate(2)
但是,如果您这样做,则FILE*
句柄不同步(您需要最后fflush(3) -bercause FILE*
缓冲 - 在truncate
之前,并且不使用相同的FILE*
而没有任何freopen(3) ...)。使用纯标准C11(参见n1570),没有办法做你想做的事。
在实践中,如果您使用truncate
,则应避免使用<stdio.h>
个函数,并直接使用read(2)和write(2)。
我不知道该文件的名称是什么(我正在编写一个函数,该函数在FILE *的类型中获取有人已经在主文件中打开的参数)。
然后我相信你不应该做你想做的事。(在某些POSIX系统上,你可以使用fileno(3)然后使用ftruncate
,但这样做是违反的来自<stdio.h>
的一些不变量并弄乱了FILE*
)
同时查看rewind(3)&amp; FSEEK(3)
答案 4 :(得分:1)
在C中没有便携式方式。
在C中,与文件的交互是通过 streams 进行的,并且不存在从流中删除内容的工具,因为这没有任何意义。 FILE*
是指向有意不透明结构的指针。
我很想在首先设置FILE*
的主叫网站上处理这个问题。