我怎样才能删除在C当前打印控制台线路? 我工作在Linux系统上。 例如 -
printf("hello");
printf("bye");
我想在地方打招呼的在同一行打印再见。
我怎样才能删除在C当前打印控制台线路? 我工作在Linux系统上。 例如 -
printf("hello");
printf("bye");
我想在地方打招呼的在同一行打印再见。
您可以使用VT100转义码 。 大多数终端,包括xterm的,是VT100知道。 用于擦除的线,这是^[[2K
。 在C这给:
printf("%c[2K", 27);
您可以使用\r
( 回车 )光标回到行的开头:
printf("hello");
printf("\rbye");
这将在同一行打印再见 。 它虽然不会删除现有字符,因为再见比你好短,你将最终byelo。 要清除它,你可以让你的新的打印更长的时间来覆盖多余的字符:
printf("hello");
printf("\rbye ");
或者,先用几个空格删除它,然后打印新的字符串:
printf("hello");
printf("\r ");
printf("\rbye");
这将打印招呼 ,然后去行的开头,并用空格覆盖它,然后回到开始再次和打印再见 。
一些有价值的细微之处...
\33[2K
擦除整个行光标是目前
\033[A
移动你的光标上线,但在同一列 ,即不是该行的开始
\r
带给你的光标到行(r是倒带)的开始,但不删除任何东西
在xterm的具体而言,我试图答复上述我发现擦除线,并在重新开始的唯一方式是(上面张贴由@ Stephan202以及@vlp和@mantal从评论)序列\33[2K\r
在一个实现笔记,得到它的,因为我没有使用新的行字符的倒计时方案正常工作,例如'\n'
在每个月底fprintf()
所以我不得不fflush()
每个流时间(给你一些情况下,我使用的是Linux机器上的叉没有重定向标准输出开始的xterm,我只是写缓存文件指针fdfile
与我坐在伪终端地址,该地址在非阻塞文件描述符我例为/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);
}
你可以使用\ b删除线
printf("hello");
int i;
for (i=0; i<80; i++)
{
printf("\b");
}
printf("bye");
通常,当你在字符串的结尾“\ r”,只有回车打印不带任何换行符。 如果您具备以下条件:
printf("fooooo\r");
printf("bar");
输出将是:
barooo
有一件事我可以建议(可能是解决方法)是有一个NULL终止被初始化为所有空格字符固定大小的字符串,以“\ r”(打印前每个时间)结束,然后使用的strcpy到您的字符串复制到它(不换行),所以每一个后续打印将覆盖以前的字符串。 事情是这样的:
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
的长度总是小于ATLEAST一个str
,但你的基本思路。
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;
}
点击查看源 。
有一个简单的技巧,你可以在这里工作,但在打印之前,需要准备,你必须把你想在一个变量来打印,然后打印,所以你会知道的长度去除string.here就是一个例子什么都。
#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 ;
}
}
刚刚发现这个古老的线程,在寻找某种转义序列的空白实际行。
这是相当有趣的没有人来的想法(或我已经错过了它)是printf的返回写入的字符数。 所以,只是打印“\ r” +尽可能多的空白字符如printf回来,你会正好空白previuosly书面文本。
int BlankBytes(int Bytes)
{
char strBlankStr[16];
sprintf(strBlankStr, "\r%%%is\r", Bytes);
printf(strBlankStr,"");
return 0;
}
int main(void)
{
int iBytesWritten;
double lfSomeDouble = 150.0;
iBytesWritten = printf("test text %lf", lfSomeDouble);
BlankBytes(iBytesWritten);
return 0;
}
正如我不能使用VT100,看来我必须坚持与解决方案