如何在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)
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)