在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()