更新C控制台应用程序中的屏幕行(unix)

时间:2013-06-24 09:39:31

标签: c unix console

我想更新C控制台应用中的屏幕。我想做一个控制台进度条。我怎么能够?看看这个:

正在下载...
| ==== | 34%
于:
正在下载...
| ===== | 50%
这些必须在同一行,我必须更新该行。

4 个答案:

答案 0 :(得分:2)

看一下这个例子:http://www.rosshemsley.co.uk/2011/02/creating-a-progress-bar-in-c-or-any-other-console-app/

重点是:

  

我们必须首先编写正确的转义序列以便终端   将知道将下一个符号作为命令执行。在C这逃脱   代码是“\ 033 [”。然后我们按照我们喜欢的任何命令来执行此操作。在此   例如我们使用“\ 033 [F”上升一行后跟“\ 033 [J”到   清楚一条线。这会擦除负载条所在的线路,以及   定位光标,以便我们可以再次重写相同的行。

// Process has done i out of n rounds,
// and we want a bar of width w and resolution r.
static inline void loadBar(int x, int n, int r, int w)
{
    // Only update r times.
    if ( x % (n/r) != 0 ) return;

    // Calculuate the ratio of complete-to-incomplete.
    float ratio = x/(float)n;
    int   c     = ratio * w;

    // Show the percentage complete.
    printf("%3d%% [", (int)(ratio*100) );

    // Show the load bar.
    for (int x=0; x<c; x++)
       printf("=");

    for (int x=c; x<w; x++)
       printf(" ");

    // ANSI Control codes to go back to the
    // previous line and clear it.
    printf("]\n\033[F\033[J");
}

答案 1 :(得分:0)

在许多系统上\ r \ n可以用来覆盖线路......你只需要确保以某种方式冲洗线路。

static const char equals[] = "=====....=====";  // 50 toal ='s

float percent;   // percentage... assuming you need floating
int   p;         // integer percentags

for ( percent = 0.0; percent < 100.0; percent++ )
{
    p = percent + 0.5;
    fprintf( stdout, "\r|%.*s | %d", p/2,equals, p );
    fflush(stdout);   // assure line written, even without \n
}

p = percent + 0.5;
printf( "\r|%.*s | %d\n", p/2,equals, p );  // final line with \n

现在是读者提防未编译和未经测试的代码的时候了。

答案 2 :(得分:0)

您只需使用\b个字符清除您的行。 printf("\b\b\b\b\b\b%5d",value); fflush(stdout)。这是一种非常简单的方法。当然,如果你需要做更复杂的事情,编辑多行,坐标管理,你应该考虑使用curses。

答案 3 :(得分:-1)

#include <stdlib.h>
#include<stdio.h>
int main(void)
{
    int i = 0;
    for(i = 0; i <= 100; i+= 10)
    {
        int j;
        for(j = 0; j <= i/10; j++)
            printf("=");

        printf("%d\n",i);
        sleep(1);
        system("clear");
    }
}