Я создаю небольшое консольное приложение, которому нужен индикатор выполнения. Что-то вроде...
Conversion: 175/348 Seconds |========== | 50%
У меня вопрос: как стереть символы, уже напечатанные на консоли? Когда я достигаю 51-го процента, мне нужно стереть эту строку с консоли и вставить новую строку. В моем текущем решении вот что происходит ...
Conversion: 175/348 Seconds |========== | 50%
Conversion: 179/348 Seconds |========== | 52%
Conversion: 183/348 Seconds |========== | 54%
Conversion: 187/348 Seconds |=========== | 56%
Код, который я использую ...
print "Conversion: $converted_seconds/$total_time Seconds $progress_bar $converted_percentage%\n";
Я делаю это в Linux, используя PHP (только я буду использовать приложение - прошу прощения за выбор языка). Итак, решение должно работать на платформе Linux, но если у вас есть кроссплатформенное решение, это будет предпочтительнее.





чтобы стереть ранее напечатанный символ, я печатаю после него пробел: напечатать "а" печать "\ b"
напечатает ничего такого (на самом деле он будет печатать, а затем возвратиться, но вы, вероятно, этого не заметите)
Я не уверен, что то же самое в Linux, но в консольных приложениях Windows вы можете напечатать \ r, и курсор вернется в первую левую позицию строки, что позволит вам перезаписать все символы справа.
Вы можете использовать \ b для перемещения назад на один символ, но, поскольку вы собираетесь обновлять индикатор выполнения, использовать \ r проще, чем печатать \ b x количество раз.
Не думаю, что вам нужно извиняться за выбор языка. PHP - отличный язык для консольных приложений.
Попробуйте это:
<?php
for( $i=0;$i<10;$i++){
print "$i \r";
sleep(1);
}
?>
«\ R» перезапишет строку новым текстом. Чтобы создать новую строку, вы можете просто использовать "\ n", но я предполагаю, что вы это уже знали.
Надеюсь это поможет! Я знаю, что это работает в Linux, но не знаю, работает ли это в Windows или других операционных системах.
Я совершенно забываю, что вы могли сделать это на оболочке.
Ух ты! Я собираюсь попробовать это. Добавлю цвета, чтобы посмотреть, работает ли
@GnomeCubed PHP никогда не должен использоваться.
\ r сделал свое дело.
Для справки в будущем \ b не работает в PHP в Linux. Мне было любопытно - поэтому я провел пару экспериментов и на других языках (я делал это в Linux - не знаю, будет ли результат таким же в Windows / Mac).
\ b Работает в ...
puts -nonewline "Hello\b"\ b Не работает в
print "Hello\b"; распечатывает Hello\bprint "Hello\b" распечатывает Hello<new line>. Тот же результат с print "Hello\b",python print добавляет \ n автоматически. используйте sys.stdout.wirte вместо print, если хотите оставаться в той же строке
Конечно, символ возврата все еще существует! Он просто недоступен в строковых литералах с escape-символом. Попробуйте chr(8).
Чтобы стереть ранее напечатанный символ, у вас есть три варианта:
echo chr(8) . " "; повторяет обратный символ и перемещает курсор на одно место назад, а затем пробел перезаписывает символ. Вы можете использовать chr(8) несколько раз подряд, чтобы переместить несколько символов назад.
echo "\r"; вернет курсор в начало текущей строки. Теперь вы можете заменить строку новым текстом.
Третий вариант - установить строку и столбец позиции курсора с помощью управляющих кодов ANSI, а затем распечатать заменяющие символы. Это может не работать со всеми терминалами:
function movecursor($line, $column){
echo "\033[{$line};{$column}H";
}
Это кажется довольно старой темой, но я расскажу о своей пятерке.
for ($i; $i<_POSITION_; $i--) {
echo "\010"; //issue backspace
}
Нашел это в Интернете некоторое время назад, к сожалению не помню где. Таким образом, все кредиты принадлежат оригинальному автору.
Кроме того, это сбивает с толку многие «глупые» терминалы (или эмуляторы терминалов, или режимы буфера мертвых кадров), равно как и различные клиенты SSH. Буквальный пробел \ b - самый безопасный способ.