Ответ 1
Это проблема буферизации потока stdout
. Вы должны очистить его явно (неявная промывка происходит с помощью \n
), используя fflush(stdout)
после printf()
:
fflush(stdout);
Многие инструменты командной строки реализуют индикатор выполнения на основе текста. Как установка 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
добавляет курсор в конец, что приводит к быстрому махающему курсору. Вы, ребята, можете это почувствовать, составив небольшую сборку. Может ли кто-нибудь придумать альтернативы, чтобы избежать этой проблемы?
Это проблема буферизации потока stdout
. Вы должны очистить его явно (неявная промывка происходит с помощью \n
), используя fflush(stdout)
после printf()
:
fflush(stdout);
Вот как это сделал rpm, возможно, вы можете написать аналогичное для своей цели: printHash.
rpm
используйте \b
вместо \r
, чтобы стереть символ выходной строки по символу.
Я считаю, используя
printf("\e[?25l");
может помочь. Это скроет курсор. Честно говоря, я не уверен, что если использование /r или printf снова переопределит этот бит кода и покажет курсор, но это стоит того. Кроме того, приведенный ниже код можно использовать для отображения курсора снова.
printf("\e[?25h");
Вместо того, чтобы давать вам некоторые ошибочные и не переносимые строки кода, я бы рекомендовал вам прочитать страницы руководства для вашей системы termcap и terminfo. Сначала это немного сложно, но нужно обязательно прочитать, если вы начнете сбрасывать терминал с зависимым кодом. Страницы в Википедии - это хорошее место для начала, но затем дайте man-страницы в вашей системе также прочитать.
И я просто понял, что ваш вопрос, безусловно, является повторением нескольких других вопросов.
Чтобы использовать форматирование на вашем терминале, проверьте код удаления ANSI.