Подтвердить что ты не робот

Как удалить печатные символы в консольном приложении (Linux)?

Я создаю небольшое консольное приложение, для которого требуется индикатор выполнения. Что-то вроде...

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, но если у вас есть решение, которое пересекает платформу, это было бы предпочтительнее.

4b9b3361

Ответ 1

Я не думаю, что вам нужно извиниться за выбор языка. PHP - отличный язык для консольных приложений.

Попробуйте следующее:

<?php
for( $i=0;$i<10;$i++){
  print "$i \r";
  sleep(1);
}
?>

"\ r" перевернет строку с новым текстом. Чтобы создать новую строку, вы можете просто использовать "\n", но я предполагаю, что вы уже это знали.

Надеюсь, это поможет! Я знаю, что это работает в Linux, но я не знаю, работает ли он в Windows или других операционных системах.

Ответ 2

Чтобы стереть ранее напечатанный символ, у вас есть три варианта:

  • echo chr(8) . " "; перекликается с обратным символом и перемещает курсор назад на одно место, а затем пробел заменяет символ. Вы можете использовать chr(8) несколько раз подряд для перемещения нескольких символов.

  • echo "\r"; вернет курсор в начало текущей строки. Теперь вы можете заменить строку новым текстом.

  • Третий вариант - установить строку и столбец позиции курсора, используя escape-коды ANSI, затем напечатать заменяющие символы. Это может не работать со всеми терминалами:

  function movecursor($line, $column){
      echo "\033[{$line};{$column}H";
  }

Ответ 3

\ r сделал трюк.

Для справки в будущем, \b не работает в PHP в Linux. Мне было любопытно, поэтому я сделал несколько экспериментов на других языках (я сделал это в Linux - я не знаю, будет ли результат в Windows/Mac одинаковым)..

\ b Работает в...

  • Perl
  • рубин
  • Tcl - с кодом puts -nonewline "Hello\b"

\ b Не работает в

  • PHP - код print "Hello\b"; выводит Hello\b
  • Python - код print "Hello\b" выводит Hello<new line>. Тот же результат с print "Hello\b",

Ответ 4

Я не уверен, что то же самое в Linux, но в консольных приложениях Windows вы можете распечатать \r, и курсор вернется в первую левую позицию строки, что позволит вам переписать все символы вправо.

Вы можете использовать \b для перемещения одного символа, но поскольку вы собираетесь обновлять индикатор выполнения, это будет проще использовать, чем печать \b x раз.

Ответ 5

Это, кажется, довольно старая тема, но я отброшу свои 5.

for ($i; $i<_POSITION_; $i--) {
   echo "\010"; //issue backspace 
}

Обнаружил это в интернете некоторое время назад, к сожалению, не помню, где. Таким образом, все кредиты принадлежат оригинальному автору.

Ответ 6

чтобы стереть ранее напечатанный символ, я распечатываю его после него: напечатать "a" print "\ b"

ничего не напечатает (на самом деле он будет печатать, а затем обратно, но вы, вероятно, его не заметите)