为何通过stdout清屏后stderr输出无法显示?求解决方案
清屏后stderr输出无法显示的解决方法
问题重现
以下代码执行后,清屏操作完成后无法看到stderr输出的错误信息:
#include <stdio.h> int main (int argc, char **argv) { printf("\033[2J\033[1;1H"); fprintf(stderr, "error !\n"); return 0; }
但改用stdout输出、或先通过stdout输出内容再用stderr输出时,均能正常显示。
问题原因
stdout默认是行缓冲模式,你调用printf输出的清屏转义序列没有换行符,导致这些内容被留在缓冲区中,直到程序退出时才会被刷新到终端。而stderr是无缓冲的,会直接输出内容。这就导致实际执行顺序是:
stderr先输出"error !\n"- 程序退出时
stdout缓冲区刷新,执行清屏操作,把刚输出的错误信息清掉了
解决方法
在清屏的printf之后,手动调用fflush(stdout)强制刷新stdout缓冲区,让清屏操作立刻生效:
#include <stdio.h> int main (int argc, char **argv) { printf("\033[2J\033[1;1H"); fflush(stdout); // 强制刷新stdout缓冲区,确保清屏操作立即执行 fprintf(stderr, "error !\n"); return 0; }
这样就能保证清屏操作先完成,再输出错误信息,自然就能看到内容了。
内容的提问来源于stack exchange,提问作者jean faure
相关产品推荐
相关产品推荐

