删除当前打印的控制台线
如何清除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
总是比str
less至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 ; } }