擦除当前打印的控制台行

新手上路,请多包涵

如何在 C 中擦除当前打印的控制台行?我正在使用 Linux 系统。例如 -

 printf("hello");
printf("bye");

我想在同一行打印再见代替你好。

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 785
2 个回答

您可以使用 VT100 转义码。大多数终端,包括 xterm,都支持 VT100。对于擦除一行,这是 ^[[2K 。在 C 中,这给出:

 printf("\33[2K\r");

原文由 mouviciel 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题