在 C 中刷新缓冲区

即使缓冲区是输出流,也不应该使用 fflush()刷新缓冲区吗?

它有什么用? 我们一般如何冲洗缓冲区?

218655 次浏览

刷新输出缓冲区:

printf("Buffered, will be flushed");
fflush(stdout); // Prints to screen or whatever your standard out is

或者

fprintf(fd, "Buffered, will be flushed");
fflush(fd);  //Prints to a file

可能是个很有用的技巧。为什么要刷新输出缓冲区?通常当我这样做时,是因为代码崩溃了,我试图调试一些东西。标准缓冲区不会每次调用 printf()时都打印,它会等到满了再立即转储一堆。因此,如果您试图检查是否在崩溃之前进行函数调用,那么对于 printf类似于“ got here!”的内容是很有帮助的,有时候在崩溃发生之前缓冲区还没有被刷新,你不知道你已经到了什么程度。

另一个有用的地方是在多进程或多线程代码中。同样,对 printf()的调用并不总是刷新缓冲区,因此如果您想知道多个进程的真实执行顺序,应该在每次打印后刷新缓冲区。

我养成了这样做的习惯,它节省了我在调试很多头痛。我能想到的唯一缺点是 printf()是一个昂贵的操作(这就是为什么它默认情况下不刷新缓冲区)。


至于刷新输入缓冲区(stdin) ,您不应该这样做。冲洗 stdin的未定义行为是根据 C11标准7.21.5.2第2部分:

如果数据流指向一个输出数据流,则 fflush 函数将导致该数据流的任何未写数据写入到文件中,否则行为是未定义的。

在某些系统上,Linux 就像您在 fflush()的手册页中看到的那样,有一个已定义的行为,但它依赖于系统,因此您的代码将不具有可移植性。

现在,如果您担心输入缓冲区中的垃圾“卡住”,那么可以对此使用 fpurge()。 有关 fflush()fpurge()的更多信息,请参见 给你