Mik*_*ike 94
我从来没有听说过不刷新输出缓冲区,我很想听听你的消息来源.刷新输出缓冲区:
printf("Buffered, will be flushed");
fflush(stdout); // Prints to screen or whatever your standard out is
Run Code Online (Sandbox Code Playgroud)
要么
fprintf(fd, "Buffered, will be flushed");
fflush(fd); //Prints to a file
Run Code Online (Sandbox Code Playgroud)
可以是一个非常有用的技术.为什么要刷新输出缓冲区?通常当我这样做时,这是因为代码崩溃,我正在尝试调试某些东西.标准缓冲区不会在每次调用printf()
时打印,直到它已满,然后立即转储一堆.因此,如果你试图在崩溃之前检查你是否正在进行函数调用,那么对于printf
像"到达这里!" 这样的东西是有帮助的,有时缓冲区在崩溃发生之前还没有被刷新,你可以'告诉你到底有多远.
另一个有用的时间是多进程或多线程代码.同样,缓冲区并不总是在调用a时刷新printf()
,所以如果你想知道多个进程的真正执行顺序,你应该在每次打印后刷新缓冲区.
我养成了这样做的习惯,这让我在调试时省去了很多麻烦.我能想到的唯一缺点是这printf()
是一个昂贵的操作(这就是为什么它默认不刷新缓冲区).
只要刷新输入缓冲区(stdin
),就不应该这样做.潮红stdin
是根据C11标准§7.21.5.2部分2未定义的行为:
如果流指向输出流... fflush函数会导致该流的任何未写入数据...被写入文件; 否则,行为未定义.
在某些系统上,正如您在手册页中看到的那样,Linux是一个fflush()
定义的行为,但它依赖于系统,因此您的代码将无法移植.
现在,如果您担心垃圾"卡在"输入缓冲区中,您可以使用fpurge()
它.有关更多信息,请参阅此处fflush()
fpurge()