擦除当前打印的控制台线

61 c linux console erase

如何在C中删除当前打印的控制台线?我正在研究Linux系统.例如 -

printf("hello");
printf("bye");
Run Code Online (Sandbox Code Playgroud)

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

mou*_*iel 62

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

printf("%c[2K", 27);
Run Code Online (Sandbox Code Playgroud)

  • 这不会将光标重置到行的开头(至少在我的终端中),因此仍需要`\ r`.请注意,不需要使用`%c`.替代方案:`printf("\ 33 [2K\r");` (42认同)
  • 请注意,Windows中不支持ANSI格式([ANSI转义码](http://en.wikipedia.org/wiki/ANSI_escape_code)).但它仍然可以使用`printf("\ r");`. (3认同)
  • @LưuVĩnhPhúc - 问题结尾为:_我正在 Linux 系统上工作_ (3认同)
  • @CocoaBob自[更改] [http://www.nivot.org/blog/post/2016/02/04/Windows-10-TH2-(v1511)-Console-Host-Enhancements)自Windows 10更新TH2起. (2认同)
  • @LưuVĩnhPhúc - 你是对的,我添加了Linux标签. (2认同)

And*_*ler 54

您可以使用\r(回车)将光标返回到行的开头:

printf("hello");
printf("\rbye");
Run Code Online (Sandbox Code Playgroud)

这将在同一行打印再见.它不会删除现有的角色,因为再见你好,你最终会被byelo所取代.要删除它,您可以延长新的打印时间以覆盖额外的字符:

printf("hello");
printf("\rbye  ");
Run Code Online (Sandbox Code Playgroud)

或者,首先用几个空格擦除它,然后打印新的字符串:

printf("hello");
printf("\r          ");
printf("\rbye");
Run Code Online (Sandbox Code Playgroud)

那将打印你好,然后转到行的开头并用空格覆盖它,然后再次返回到开头并打印再见.


J-a*_*u-s 34

一些有价值的细微之处......

\33[2K 擦除光标当前所在的整行

\033[A将光标向上移动一行,但在同一列中,即不在行的开头

\r将光标移到行的开头(r用于倒带)但擦除任何内容

特别是在xterm中,我尝试了上面提到的回复,我发现擦除行并在开头重新开始的唯一方法是序列(来自@ Stephan202以及@vlp和@mantal发布的上述评论) \33[2K\r

在实现说明中,为了使其正常工作,例如在倒计时场景中,因为我没有'\n' 在每个末尾使用新行字符fprintf(),所以我fflush()每次都要使用流(为了给你一些上下文,我开始xterm在linux机器上使用fork而不重定向stdout,我只是fdfile用一个非阻塞文件描述符写入缓冲的FILE指针,我坐在伪终端地址上,在我的情况下是/dev/pts/21):

fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
Run Code Online (Sandbox Code Playgroud)

请注意,我使用\ 33 [2K序列擦除行后跟\r倒带序列,将光标重新定位在行的开头.我不得不fflush()在每次之后,fprintf()因为我最后没有新的线条字符'\n'.不需要fflush()的相同结果将需要额外的序列上升一行:

fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
Run Code Online (Sandbox Code Playgroud)

请注意,如果在要写入的行的正上方有某些内容,则会使用第一个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);
}
Run Code Online (Sandbox Code Playgroud)

  • `\ r`是"回车"的缩写,而不是"倒带",是旧的打字机的遗物,它有"将光标移回第一列"(`\ r``)和"提前页面"的单独操作下一行"(`\n`). (2认同)