擦除当前印刷控制台线路(Erase the current printed console line

2019-07-20 13:41发布

我怎样才能删除在C当前打印控制台线路? 我工作在Linux系统上。 例如 -

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

我想在地方打招呼的在同一行打印再见。

Answer 1:

您可以使用VT100转义码 。 大多数终端,包括xterm的,是VT100知道。 用于擦除的线,这是^[[2K 。 在C这给:

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


Answer 2:

您可以使用\r ( 回车 )光标回到行的开头:

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

这将在同一行打印再见 。 它虽然不会删除现有字符,因为再见你好短,你将最终byelo。 要清除它,你可以让你的新的打印更长的时间来覆盖多余的字符:

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

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

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

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



Answer 3:

一些有价值的细微之处...

\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);
}


Answer 4:

你可以使用\ b删除线

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


Answer 5:

通常,当你在字符串的结尾“\ 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 ,但你的基本思路。



Answer 6:

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;
}


Answer 7:

这个脚本是硬编码为你的榜样。

#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;
}

点击查看源 。



Answer 8:

有一个简单的技巧,你可以在这里工作,但在打印之前,需要准备,你必须把你想在一个变量来打印,然后打印,所以你会知道的长度去除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 ;
    }

}


Answer 9:

刚刚发现这个古老的线程,在寻找某种转义序列的空白实际行。

这是相当有趣的没有人来的想法(或我已经错过了它)是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,看来我必须坚持与解决方案



文章来源: Erase the current printed console line