2017-01-04 12 views
1

私の計算ツール(cで書かれています)のプログレスバーを追加する際に問題があります。単純な進捗バーコードがあるので、進捗状況を印刷することができます:コンソールの全幅プログレスバー

void print_progress(float progress) 
{ 
    int barWidth = 70; 
    int pos = barWidth * progress; 

    printf("%c",'['); 

    for (int i = 0; i < barWidth; ++i) 
    { 
     if (i < pos) { 
      printf("%c",'='); 
     } 
     else if (i == pos) { 
      printf("%c",'>'); 
     } 
     else { 
      printf("%c",' '); 
     } 
    } 

    printf("] %f%% \r",(progress * 100.0)); 
    fflush(stdout); 
} 

ただし、固定幅の進行状況バーだけが印刷されます。これを変更して画面の幅を読み取り、全幅のプログレスバーを印刷できますか?

struct winsize max; 
ioctl(0, TIOCGWINSZ , &max); 
printf ("columns %d\n", max.ws_col); // Always 70 

そしてまた、私は、依存関係を追加する必要はありません。私がこれまで試した何(のようwgetまたはapt-getプログレスバー)

UPDATE

はioctlを使用して、端末の幅を読み取ることです以下のようなncurses ...

UPDATE 2

バージョン(動作しない)決勝:

void loadbar(unsigned int x, unsigned int n, unsigned int max_width) { 
    struct winsize ws; 
    ioctl(0, TIOCGWINSZ, &ws); 
    int barWidth = ws.ws_col; 
    if(barWidth > max_width) { 
     barWidth = max_width; 
    } 
    float ratio = x/(float)n; 
    int c  = ratio * barWidth; 
    printf("%s","["); 
    for (x=0; x<c; x++) { 
     printf("%s","="); 
    } 
    printf("%s",">"); 
    for (x=c+1; x<barWidth; x++) { 
     printf("%s"," "); 
    } 
    printf("] %03.2f%%\r",100.0*ratio); 
    fflush(stdout); 
} 
+0

あなたは右、固定 'barWidth'がありますか?あなたはそれをどのように拡大・縮小したいのですか? –

+0

@SouravGhoshはい固定のbarWidthがあります。固定しないようにしてください。現在の端子の幅を読み替えてください。 –

+0

それで、あなたの試みは何ですか? –

答えて

0

だけを使用します。

struct winsize w; 
ioctl(0, TIOCGWINSZ, &w); 

printf ("lines %d\n", w.ws_row); 
printf ("columns %d\n", w.ws_col); 
+0

既に試しました。あなたが試したコードを投稿すると常に –

+0

を返します –

+0

問題のボディの最終バージョンをお読みください –

関連する問題