【问题标题】:How can I delete all the text from text file in c? [duplicate]如何从c中的文本文件中删除所有文本? [复制]
【发布时间】:2018-10-31 06:19:42
【问题描述】:

给定参数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);

【问题讨论】:

  • freopen 将完成这项工作
  • 我可以用 print "" 以某种方式做到这一点(并且无需再次打开文件吗?)
  • @JohnnyMopp 我编辑了我的问题。
  • @Software_t:这会改变一切(使答案无效,但使问题变得有趣)。
  • @Bathsheba 在那之后,我看到了答案,我明白这很重要(我确信通过将空字符串打印到文件或类似的东西以某种方式存在)。

标签: c file fopen


【解决方案1】:

您可以使用write 标志打开它

fopen(filename, "w")

如果该文件已存在,则会被新的空文件覆盖。

【讨论】:

  • 我可以用 print "" 以某种方式做到这一点(并且无需再次打开文件?)
  • @Software_t 不能只使用 ISO C 标准中的函数。
【解决方案2】:

您可以使用ftruncate 函数截断打开的文件。此处的文档:

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

ftruncate(fileno(fd), 0);

【讨论】:

  • 之前最好打电话给fflush,看看我的回答为什么
【解决方案3】:

在 C 中没有可移植的方法。

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

我很想在首先设置FILE* 的调用站点处理这个问题。

【讨论】:

    【解决方案4】:

    关闭并重新打开文件(如 Kira Sama's answer 中的建议),或者,在 POSIX 系统上使用 truncate(2)

    但是,如果您这样做,FILE* 句柄将不同步(您最后需要将fflush(3) - 因为FILE*缓冲- 在truncate 之前,并且不要使用相同的 FILE* 而不使用任何 freopen(3)...)。使用纯标准 C11(请参阅 n1570),没有办法做你想做的事。

    在实践中,如果你使用truncate,你应该避免使用<stdio.h>函数,直接使用read(2)write(2)

    您可能会对 sqlitegdbm 等更高级别的库感兴趣。

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

    那么我相信你不应该做你想做的事。(在一些 POSIX 系统上,你可能会使用fileno(3),然后是ftruncate,但这样做你违反了@的一些不变量987654339@ 和你的FILE* 搞砸了)

    同时查看rewind(3) & fseek(3)

    【讨论】:

      【解决方案5】:

      您可以在除 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);
      

      【讨论】:

      • ftruncate 在 Windows 上受支持。首先,微软在他们的 Visual C 运行时库中拥有几乎相同的界面;他们只是将其重命名为_chsizeftruncate 也在 Cygwin 中,因此 Cygnal
      • 视觉 C:_chsize(_fileno(fp), 0)。 size 参数是 long 而不是 off_t
      • @Kaz:是的,Windows 上提供了等效功能。但它是一个在不同头文件中具有不同名称的函数。
      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多