删除当前打印的控制台线

如何清除C中当前打印的控制台行? 我正在开发一个Linux系统。 例如 –

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

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

您可以使用VT100转义码 。 大多数terminal(包括xterm)都可以识别VT100。 为了消除一条线,这是^[[2K 。 在C中给出:

 printf("%c[2K", 27); 

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

 printf("hello"); printf("\rbye"); 

这将打印再见在同一行。 虽然不会抹掉现有的人物,但是由于再见你好 ,你会以byelo结束。 要清除它,您可以使新的打印时间更长以覆盖额外的字符:

 printf("hello"); printf("\rbye "); 

或者,先用几个空格删除它,然后打印新的string:

 printf("hello"); printf("\r "); printf("\rbye"); 

这将打印你好 ,然后去行的开始,并用空格覆盖它,然后再回到开头,再打印再见

一些有价值的微妙之处

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

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

\r将光标移动到行的开头(r用于倒回),但不会擦除任何东西

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

在一个实现说明中,为了让它在倒计时的情况下正常工作,因为我没有在每个fprintf()的末尾使用一个新的行字符'\n' ,所以我不得不每次fflush()时间(给你一些上下文,我启动xterm在Linux机器上使用fork而不redirect标准输出,我只是写一个非阻塞文件描述符缓冲的文件指针fdfile我坐在我的伪terminal地址在我的案例是/dev/pts/21 ):

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

请注意,我使用了\ 33 [2K序列来擦除后面的\r倒带序列,以便在行首重新定位光标。 我必须在每个fprintf() fflush()之后使用fflush() ,因为我在末尾没有新的行字符'\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); } 

通常当string的末尾有一个'\ r'时,只有回车符被打印出来而没有任何换行符。 如果您有以下情况:

 printf("fooooo\r"); printf("bar"); 

输出将是:

 barooo 

我可以build议的一件事(也许是一个解决方法)是有一个NULL终止固定大小string初始化为所有空格字符,以'\ r'结尾(每打印之前),然后使用strcpy将您的string复制到它(没有换行符),所以每一个后续的打印都会覆盖前一个string。 像这样的东西:

 char str[MAX_LENGTH]; // init str to all spaces, NULL terminated with character as '\r' strcpy(str, my_string); // copy my_string into str str[strlen(my_string)] = ' '; // erase null termination char str[MAX_LENGTH - 1] = '\r'; printf(str); 

你可以做错误检查,这样my_string总是比strless至less一个,但是你得到了基本的想法。

您可以使用\ b删除这一行

 printf("hello"); int i; for (i=0; i<80; i++) { printf("\b"); } printf("bye"); 

i遍历字符数组的单词。 j跟踪字长。 "\b \b"在备份时擦除单词。

 #include<stdio.h> int main() { int i = 0, j = 0; char words[] = "Hello Bye"; while(words[i]!='\0') { if(words[i] != ' ') { printf("%c", words[i]); fflush(stdout); } else { //system("ping -n 1 127.0.0.1>NUL"); //For Microsoft OS system("sleep 0.25"); while(j-->0) { printf("\b \b"); } } i++; j++; } printf("\n"); return 0; } 

这个脚本是硬编码的例子。

 #include <stdio.h> int main () { //write some input fputs("hello\n",stdout); //wait one second to change line above sleep(1); //remove line fputs("\033[A\033[2K",stdout); rewind(stdout); //write new line fputs("bye\n",stdout); return 0; } 

点击这里查看源代码 。

有一个简单的技巧,你可以在这里工作,但是在打印之前需要做好准备,你必须把想要打印的东西放在一个variables中,然后打印,这样你就知道删除string的长度。

 #include <iostream> #include <string> //actually this thing is not nessasory in tdm-gcc using namespace std; int main(){ //create string variable string str="Starting count"; //loop for printing numbers for(int i =0;i<=50000;i++){ //get previous string length and clear it from screen with backspace charactor cout << string(str.length(),'\b'); //create string line str="Starting count " +to_string(i); //print the new line in same spot cout <<str ; } }