72

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

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

4

1 回答 1

116

刷新输出缓冲区:

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“到达这里!”之类的东西很有帮助,有时在崩溃发生之前缓冲区还没有被刷新,你可以'不知道你真的走了多远。

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

我养成了这样做的习惯,它让我在调试时省去了很多麻烦。我能想到的唯一缺点是这printf()是一项昂贵的操作(这就是为什么它默认不刷新缓冲区的原因)。


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

如果流指向输出流... fflush 函数会导致该流的任何未写入数据... 被写入文件;否则,行为未定义。

On some systems, Linux being one as you can see in the man page for fflush(), there's a defined behavior but it's system dependent so your code will not be portable.

Now if you're worried about garbage "stuck" in the input buffer you can use fpurge() on that. See here for more on fflush() and fpurge()

于 2012-09-16T19:43:22.850 回答