удаление мигания курсора в терминале, как?

Я использую следующие строки для вывода информации о ходе моделирования в моей программе на С ++,

double N=0;
double percent=0;
double total = 1000000;
for (int i; i<total; ++i)
{
    percent = 100*i/total;
    printf("\r[%6.4f%%]",percent);
}

Работает отлично!

Но проблема в том, что я вижу, что курсор терминала продолжает циклически мигать через цифры, это очень раздражает, кто-нибудь знает, как от этого избавиться?

Я видел некоторые программы, такие как wget или ubuntu apt, они тоже используют индикатор выполнения или проценты, но у них, похоже, нет проблемы с мигающим курсором, мне интересно, как они это сделали?

Спасибо!

Ответы на вопрос(6)

stdout буферизован, так что вы фактически не знаете, сколько символов печатается в определенный момент времени. Причинаwget не имеет прыгающего курсора в том, что они на самом деле печатаютstderr вместо. Попробуйте следующее:

fprintf(stderr,"\r[%6.4f%%]",percent);

Это также имеет преимущество, заключающееся в том, что файл не загромождается, если вы сохраняете оставшуюся часть вывода где-нибудь, используя такой канал:

$ ./executable > log.data
Решение Вопроса

попробуйте использовать правильное количество символов \ apos; \ b & apos; (backspace) символы вместо "\ r".

== РЕДАКТИРОВАТЬ ==

Я не мастер оболочки Linux, но это может сработать:

system("setterm -cursor off");
// ...display percentages...
system("setterm -cursor on");

Не забудьте#include <cstdlib> или же<iostream>.

 Daniel12 июн. 2012 г., 00:31
Отлично! Это работает
 Daniel12 июн. 2012 г., 00:18
Ой, я люблю цифры :) Хорошо, я попробую # и сообщу результаты, но в любом случае, просто Google, кто-то сказал, что wget не использует ncurses
 12 июн. 2012 г., 00:10
Зачем тебе проц? Вы можете просто написать «#». персонажи, один за другим. Например, один '#'; за каждые новые 10% с.
 Daniel12 июн. 2012 г., 16:45
К сожалению, после выключения он не может быть снова включен
 Daniel12 июн. 2012 г., 00:08
К сожалению, безуспешно :(

Ncurses, Увидетьmvaddstr

 23 янв. 2014 г., 20:31
wget и fbi являются двумя примерами программ, которые не используют ncurses, но способны полностью скрыть курсор.

DECTCEM (Режим включения текстового курсора DEC) вDECSM а такжеDECRM:

fputs("\e[?25l", stdout); /* hide the cursor */

fputs("\e[?25h", stdout); /* show the cursor */
 12 дек. 2018 г., 00:01
Спасибо. Это работает для меня.
 12 июн. 2012 г., 17:42
Везде, где они требуются. Обычно вы скрываете курсор перед любыми обновлениями, выполняете все обновления и затем показываете его снова в конце. Вы даже можете объединить их все в одномprintf если ты хочешь.
 Daniel12 июн. 2012 г., 16:46
Вы имеете в виду в цикле, после этой командыprintf("\r[%6.4f%%]",percent);?

менно скрыть курсор.

Однако это только часть решения. Ваша программа также должна учитывать это:

after hiding the cursor and modifying the screen, before showing the cursor again move it back to the original location. hiding/showing the cursor only keeps the cursor from noticeably blinking when your updates take only a small amount of time. If you happened to mix this with some time-consuming process, your cursor will blink.

Предлагаемое решение с использованиемsetterm не переносимый; это специфично для консоли Linux. И запуск исполняемого файла с использованиемsystem не действительно необходимо. Но даже работает

system("tput civis");
...
system("tput cnorm");

это улучшение по сравнению с использованиемsetterm.

Проверка исходного кода дляwget не находит скрывающих курсор escape-последовательностей. То, что вы видите с его индикатором выполнения, это то, что он оставляет курсор примерно в одном и том же месте всякий раз, когда он занимает много времени. Вывод на терминал занимает так мало времени, что вы не замечаете мгновенное переписывание строки (печатая возврат каретки, затем переписывая большую часть строки заново). Если бы это было медленнее, то скрытие курсора помогло бы & # x2014; к точке.

Кстати & # x2014; эта техника сокрытия курсора используется в драйверах терминала для некоторых редакторов (vim иподлый).

 23 июл. 2017 г., 07:59
Я думаю, что настоящая причина, почемуwget не имеет этой проблемы, потому что они печатают вstderr который небуферизован, а неstdout который буферизован.

нажмите кнопкуfn введите вашу клавиатуру. Это определенно будет работать
Надеюсь это поможет

Ваш ответ на вопрос