我的程序中有这段代码
while(1){
// some code here
fprintf(stdout,"Output Log");
fprintf(stderr,"Error Log");
//some code here
}
仅打印“错误日志”。看起来我错过了两个fprintf之间的冲洗。因此我将“\ n”附加到字符串“输出日志”。工作得很好。但当我换掉两个fprintf
时,无法理解这种奇怪的行为while(1){
// some code here
fprintf(stderr,"Error Log\n");
fprintf(stdout,"Output Log");
//some code here
}
尽管使用“\ n”,它只会打印“错误日志”。
答案 0 :(得分:5)
你的错误是假设两条消息“之间”的换行符导致两者都出现。它实际上是stdout
输出结尾的新行,导致stdout
的消息显示(stderr
的消息始终可见,因为{ {1}}是无缓冲的。)
在任何情况下,除非您在stderr
上手动设置行缓冲模式,否则依赖换行刷新缓冲区是不可靠的。 line-buffered只是stdout
是终端时的默认值。如果您不想强制使用行缓冲或非缓冲模式,那么必须使用stdout
才能将输出可靠地交错到fflush
和stdout
。
答案 1 :(得分:1)
stderr
很特别。在应用程序启动时,它永远不会像stdout
那样完全缓冲。它的实现取决于它是否是行缓冲的,它可能根本没有缓冲(如此处所示)。
如果将它们连接到同一输出设备,则没有区别。当你想到它时,这是有道理的;你可能希望尽可能快地刷新你的错误。
答案 2 :(得分:1)
似乎缓存了stdout
,而stderr
则没有。由于程序永远不会结束,因此永远不会刷新缓冲区。