Как сделать "индикатор выполнения" с помощью printf?

Многие инструменты командной строки реализуют индикатор выполнения на основе текста. Как установка rpm:

установка ############## [45%]

# растет с процентом, а сам остается в одной строке. То, что я хочу, является чем-то похожим: мне нужен индикатор прогресса, принимающий только одну строку, т.е. Когда процент растет, он переписывается вместо новой строки (\n).

Я пробовал это:

   #include <stdio.h>

   int main (){
       int i = 0;
       for (i = 0; i < 10000; i++){
           printf("\rIn progress %d", i/100);
       }
       printf("\n");
   }

\r работает, чтобы перезаписать одну строку. Тем не менее, \r приводит курсор к началу строки, а printf добавляет курсор в конец, что приводит к быстрому махающему курсору. Вы, ребята, можете это почувствовать, составив небольшую сборку. Может ли кто-нибудь придумать альтернативы, чтобы избежать этой проблемы?

Ответы

Ответ 1

Это проблема буферизации потока stdout. Вы должны очистить его явно (неявная промывка происходит с помощью \n), используя fflush(stdout) после printf():

fflush(stdout);

Ответ 2

Вот как это сделал rpm, возможно, вы можете написать аналогичное для своей цели: printHash.

rpm используйте \b вместо \r, чтобы стереть символ выходной строки по символу.

Ответ 3

Я считаю, используя

printf("\e[?25l");

может помочь. Это скроет курсор. Честно говоря, я не уверен, что если использование /r или printf снова переопределит этот бит кода и покажет курсор, но это стоит того. Кроме того, приведенный ниже код можно использовать для отображения курсора снова.

printf("\e[?25h");

Ответ 4

Вместо того, чтобы давать вам некоторые ошибочные и не переносимые строки кода, я бы рекомендовал вам прочитать страницы руководства для вашей системы termcap и terminfo. Сначала это немного сложно, но нужно обязательно прочитать, если вы начнете сбрасывать терминал с зависимым кодом. Страницы в Википедии - это хорошее место для начала, но затем дайте man-страницы в вашей системе также прочитать.

И я просто понял, что ваш вопрос, безусловно, является повторением нескольких других вопросов.

Ответ 5

Чтобы использовать форматирование на вашем терминале, проверьте код удаления ANSI.