在C中刷新缓冲区

即使是输出stream, fflush()不能用来刷新缓冲区吗?

有什么用? 一般来说,我们如何冲洗一个缓冲区?

我从来没有听说过不冲洗输出缓冲区,我有兴趣听到你的来源。 刷新输出缓冲区:

 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 

可以是一个非常有用的技术。 你为什么要刷新一个输出缓冲区? 通常当我这样做,这是因为代码崩溃,我试图debugging的东西。 标准缓冲区不会在每次调用printf()时都打印出来,它会一直等待,直到堆满。 所以,如果你想在崩溃之前检查你是否正在调用一个函数,那么printf一下像“got here!”这样的东西是有帮助的,有时在崩溃发生之前缓冲区没有被刷新,你可以不知道你真的得到了多less。

另一次有用的是多进程或multithreading代码。 同样,缓冲区并不总是在调用printf()刷新,所以如果你想知道多个进程的执行顺序,你应该在每次打印之后刷新缓冲区。

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


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

如果stream指向一个输出stream… fflush函数会导致该stream的任何未写入数据被写入文件; 否则,行为是不确定的。

在某些系统上,Linux可以在fflush()的手册页中看到,但有一个定义的行为,但是它依赖于系统,所以你的代码不能移植。

现在如果你担心input缓冲区中的垃圾“卡住”,你可以使用fpurge() 。 有关fflush()fpurge()