写入文件时,ferror() 的错误标志会一直保持为真吗?

编程语言 2026-07-11

我在用C 把数据写入一个文件,想要确保能够在错误发生时及时捕捉到错误,尽管不一定要在错误发生的那一刻就捕捉,但要在我关闭文件之前捕捉到。

我的当前做法如下:

FILE *f = fopen("file.txt", "w")
int err;
if (!f) handle_error();
fprintf(f, "foo %d\n", x);
fprintf(f, "bar %s\n", s);
err = ferror(f);
if (fclose(f) != 0 || err) handle_error();

我并不仅仅在实际程序中对 fprintf 调用两次,而是会调用很多次。我把代码片段简化为只有两次调用。我的想法是,我并不是每次都检查 fprintf 的返回值,而是在执行 fclose() 之前先调用 ferror()

我的问题是,C标准是否保证在我显式调用 clearerr() 之前,ferror() 指示器会一直保持开启?是否存在这样的风险:库的 fprintf 实现可能在写入文件之前自动调用 clearerr()

解决方案

我的问题是,C标准是否保证在我显式调用 clearerr() 之前,ferror() 指示器会一直保持开启?

对于一个 FILE 流,其错误指示器只有在以下两种情形之一才会被清除:

  • 调用 clearerr
  • 调用 rewind

因此就你的情况而言,由于你没有调用 rewind,你可以确定在你调用 ferror 之前的任意时间发生错误时,错误指示器将被置位。

C23草案标准 的第7.23节中,错误指示器在多个地方被提及,并且只在这两个地方提到它会被清除。它还提到可能设置它的函数,具体包括:

  • fflush
  • fgetc
  • fputc
  • getc
  • getchar
  • putc
  • putchar
  • fseek
  • fsetpos

虽然 fprintf 并未被明确列为可以设置错误指示器的函数,但它被归类为一个“字节输出函数”,其工作方式是通过对 fputc 的多次调用来实现。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章