2017-01-04 10 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); 
} 

Хотя, он печатает только индикатор прогресса фиксированной ширины. Как я могу изменить это, чтобы прочитать ширину экрана и распечатать индикатор выполнения полной ширины? (Как wget или apt-get) прогресс баров

UPDATE

То, что я пытался до сих пор читать ширину вывода с помощью IOCTL:

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

А также я не хочу, чтобы добавить зависимость как ncurses ...

UPDATE 2

Final (не работает) версия:

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', верно? Как вы хотите, чтобы он расширил-заключил договор _automatically_? –

+0

@SouravGhosh Да, у меня есть фиксированная ширина бара, и я хочу, чтобы она не фиксировалась: вместо этого прочитайте текущую ширину клемм. –

+0

Итак, какова ваша попытка? –

ответ

0

Просто используйте:

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

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

Уже пробовал. Всегда возвращается 70 –

+0

Отправте код, который вы пробовали –

+0

Прочтите окончательную версию в вопросе о теле –