У меня возникли проблемы с добавлением индикатора выполнения для моего инструмента расчета (см. 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);
}
Вы фиксированный 'barWidth', верно? Как вы хотите, чтобы он расширил-заключил договор _automatically_? –
@SouravGhosh Да, у меня есть фиксированная ширина бара, и я хочу, чтобы она не фиксировалась: вместо этого прочитайте текущую ширину клемм. –
Итак, какова ваша попытка? –