如何在 C 中擦除当前打印的控制台行?我正在使用 Linux 系统。例如 -
printf("hello");
printf("bye");
我想在同一行打印再见代替你好。
原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议
一些有价值的微妙之处……
\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
回车序列将光标重新定位在行首。我不得不在每个 --- fflush()
之后 fprintf()
因为我在末尾没有 '\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);
}
原文由 J-a-n-u-s 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答795 阅读✓ 已解决
您可以使用 VT100 转义码。大多数终端,包括 xterm,都支持 VT100。对于擦除一行,这是
^[[2K
。在 C 中,这给出: