我的程序中有以下代码
while(1){
// some code here
fprintf(stdout,"Output Log");
fprintf(stderr,"Error Log");
//some code here
}
只打印"Error Log"。看起来我在两个脚印之间漏了水。因此,我将"n"附加到字符串"输出日志"。工作得很好。但是我不能理解这个奇怪的行为当我交换两个fprintf
while(1){
// some code here
fprintf(stderr,"Error Logn");
fprintf(stdout,"Output Log");
//some code here
}
尽管使用"n",它只打印"Error log".
你的错误是假设两个消息之间的换行符是导致两个消息同时出现的原因。它实际上是在输出到stdout
的末尾的换行符,这导致出现给stdout
的消息(给stderr
的消息总是可见的,因为stderr
没有缓冲)。
在任何情况下,依靠换行符来刷新缓冲区是不可靠的,除非你在stdout
上手动设置行缓冲模式;line- buffers仅在stdout
为终端时为默认值。如果您不想强制行缓冲或非缓冲模式,那么必须使用fflush
来获得输出到stdout
和stderr
的可靠交错。
stderr
是特殊的。它永远不会像stdout
那样在应用程序启动时完全缓冲。它取决于是否行缓冲,也可能根本不缓冲(就像这里看起来的那样)。
如果它们连接到相同的输出设备,则没有区别。仔细想想,这是有道理的;您可能希望尽可能快地刷新错误。
似乎stdout
是缓冲的,而stderr
不是。由于程序永远不会结束,所以缓冲区永远不会刷新。