Как сделать "индикатор выполнения" с помощью 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 доводит курсор до конца, что приводит к быстрому размахиванию указатель. Вы, ребята, можете почувствовать это, немного собрав. Может кто-нибудь придумать альтернативы, чтобы избежать этой проблемы?

5 ответов


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

fflush(stdout);

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

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


Я верю, что с помощью

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

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

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

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

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


чтобы использовать форматирование на вашем терминале, проверьте ANSI escape-код.