Как стереть напечатанные символы в консольном приложении (Linux)? - PullRequest
15 голосов
/ 10 января 2009

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

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

Ответы [ 6 ]

18 голосов
/ 10 января 2009

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

Попробуйте это:

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

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

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

9 голосов
/ 08 мая 2010

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

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

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

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

  function movecursor($line, $column){
      echo "\033[{$line};{$column}H";
  }
8 голосов
/ 10 января 2009

сделал свое дело.

Для дальнейшего использования \ 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 голосов
/ 10 января 2009

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

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

2 голосов
/ 14 октября 2012

Кажется, это довольно старая тема, но я добавлю свои 5.

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

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

0 голосов
/ 10 января 2009

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

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

...