一些有价值的微妙之处...
\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);
请注意,我既使用\ 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);
}