0

我的程序中有这段代码

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

4

3 回答 3

5

您的错误是假设两条消息“之间”的换行符是导致两者出现的原因。它实际上是输出末尾的换行符stdout导致消息stdout出现(消息stderr始终可见,因为stderr没有缓冲)。

在任何情况下,依靠换行符来刷新缓冲区是不可靠的,除非您手动设置行缓冲模式 on stdout; line-buffered 仅当stdout是终端时才默认。如果您不想强制行缓冲或非缓冲模式,则必须使用fflush 来获得可靠的输出交错到stdoutstderr

于 2013-02-28T07:08:04.657 回答
1

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

如果它们被拴在同一个输出设备上,那没有什么区别。仔细想想,这是有道理的。您可能希望尽可能快地清除错误。

于 2013-02-28T07:07:29.903 回答
1

它似乎stdout是缓冲的,stderr但不是。由于程序永远不会结束,缓冲区永远不会被刷新。

于 2013-02-28T07:07:39.347 回答