我想在清除终端后打印错误,但是错误没有出现:
#include <stdio.h>
int main (int argc, char **argv) {
printf("\033[2J\033[1;1H");
fprintf(stderr, "error !\n");
return 0;
}
它与
stdout
完美配合,如果我首先在 stdout
中打印一些内容,然后在 stderr
中打印,它就可以工作。
我尝试过使用
printf("\033[2J\033[1;1H");
来清除终端,这是同样的问题。
有办法做到这一点吗?
您正在遭受缓冲之苦。
默认情况下,
stdout
如果连接到终端,则为行缓冲。stdout
否则是块缓冲的。stderr
未缓冲。(这不是 C 强制要求的,但建议这样做,并且这是您从主要操作系统上的主要编译器获得的。)
一些定义:
由于您没有填充
stdout
的缓冲区,并且由于打印内容中缺少换行符,因此 printf
不会向操作系统输出任何内容。仅当程序退出时关闭句柄时,控制序列才会输出到操作系统,您将消息打印到stderr
。
在打印到
stdout
之前刷新 stderr
的缓冲区将解决该问题。
printf("\033[2J\033[1;1H");
fflush(stdout); // Send everything that's in the buffer to the OS *now*.
fprintf(stderr, "error !\n");