stderr的怪异行为

时间:2013-02-28 07:04:55

标签: c++ c stdout stderr

我的程序中有这段代码

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”,它只会打印“错误日志”。

3 个答案:

答案 0 :(得分:5)

你的错误是假设两条消息“之间”的换行符导致两者都出现。它实际上是stdout输出结尾的新行,导致stdout的消息显示(stderr的消息始终可见,因为{ {1}}是无缓冲的。)

在任何情况下,除非您在stderr上手动设置行缓冲模式,否则依赖换行刷新缓冲区是不可靠的。 line-buffered只是stdout是终端时的默认值。如果您不想强制使用行缓冲或非缓冲模式,那么必须使用stdout才能将输出可靠地交错到fflushstdout

答案 1 :(得分:1)

stderr很特别。在应用程序启动时,它永远不会像stdout那样完全缓冲。它的实现取决于它是否是行缓冲的,它可能根本没有缓冲(如此处所示)。

如果将它们连接到同一输出设备,则没有区别。当你想到它时,这是有道理的;你可能希望尽可能快地刷新你的错误。

答案 2 :(得分:1)

似乎缓存了stdout,而stderr则没有。由于程序永远不会结束,因此永远不会刷新缓冲区。