如何删除c中文本文件中的所有文本?

时间:2018-05-21 14:54:44

标签: c file fopen

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);

5 个答案:

答案 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)

您可以使用ftruncate功能截断打开的文件。文档:

https://linux.die.net/man/2/truncate

ftruncate(fileno(fd), 0);

答案 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)

也许像sqlitegdbm这样的高级图书馆会让您感兴趣。

  

我不知道该文件的名称是什么(我正在编写一个函数,该函数在FILE *的类型中获取有人已经在主文件中打开的参数)。

然后我相信你不应该做你想做的事。(在某些POSIX系统上,你可以使用fileno(3)然后使用ftruncate,但这样做是违反的来自<stdio.h>的一些不变量并弄乱了FILE*

同时查看rewind(3)&amp; FSEEK(3)

答案 4 :(得分:1)

在C中没有便携式方式。

在C中,与文件的交互是通过 streams 进行的,并且不存在从流中删除内容的工具,因为这没有任何意义。 FILE*是指向有意不透明结构的指针。

我很想在首先设置FILE*的主叫网站上处理这个问题。