一些有价值的微妙之处......
\33[2K 擦除光标当前所在的整行
\033[A 将光标向上移动一行,但在同一列,即不在行首
\r 将光标移至行首(r 用于回车 NB 回车不包含换行符,因此光标保持在同一行)但 不 删除任何内容
特别是在 xterm 中,我尝试了上面提到的回复,我发现删除该行并从头开始重新开始的唯一方法是序列(来自@Stephan202 以及@vlp 和@mantal 发布的上述评论) \33[2K\r
在实现说明中,为了让它在例如倒计时场景中正常工作,因为我没有使用换行符'\n'
在每个fprintf() 的末尾,所以我每次都必须fflush() 流(为了给你一些上下文,我在Linux 机器上使用fork 启动xterm 而不重定向stdout,我只是在写入缓冲的文件指针fdfile 带有非阻塞文件描述符,我坐在伪终端地址上,在我的例子中是 /dev/pts/21):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
请注意,我使用了 \33[2K 序列来擦除行,然后使用\r 回车序列将光标重新定位在行首。我不得不在每个fprintf() 之后@ 987654332@,因为我在'\n' 末尾没有换行符。不需要 fflush() 的相同结果将需要额外的序列才能上一行:
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
请注意,如果您在要写入的行的正上方有内容,它将被第一个 fprintf() 覆盖。您必须在上面多留一行,以便第一次向上移动一行:
i = 3;
fprintf(fdfile, "\nText to keep\n");
fprintf(fdfile, "Text to erase****************************\n");
while(i > 0) { // 3 second countdown
fprintf(fdfile, "\033[A\33[2KT\rT minus %d seconds...\n", i);
i--;
sleep(1);
}