stderr的怪异行为

Kau*_*eya 0 c c++ stdout stderr

我的程序中有这个代码

while(1){
  // some code here

 fprintf(stdout,"Output Log");
 fprintf(stderr,"Error Log");


 //some code here
      }
Run Code Online (Sandbox Code Playgroud)

它只打印"错误日志".看起来我错过了两个fprintf之间的冲洗.因此我将"\n"附加到字符串"输出日志".工作得很好.但当我换掉两个fprintf时,无法理解这种奇怪的行为

while(1){
  // some code here
 fprintf(stderr,"Error Log\n");
 fprintf(stdout,"Output Log");    

 //some code here
      }
Run Code Online (Sandbox Code Playgroud)

尽管使用"\n"它只打印"错误日志".

R..*_*R.. 5

你的错误是假设两条消息"之间"的换行符导致两者都出现.它实际上是输出结尾的换行符stdout导致消息stdout出现(消息stderr始终可见,因为它stderr是无缓冲的).

在任何情况下,除非你手动设置行缓冲模式,否则依赖换行刷新缓冲区是不可靠的stdout.line-buffered只是stdout终端时的默认值.如果你不希望强制行缓冲或无缓冲模式,那么你必须使用fflush 得到输出的可靠交织以stdoutstderr.