Pergunta

Estou criando um pequeno aplicativo console que precisa de uma barra de progresso. Algo como ...

Conversion: 175/348 Seconds   |==========          |  50%

A minha pergunta é, como você apagar personagens já impresso para o console? Quando eu atingir o percentual 51, eu tenho que apagar essa linha a partir do console e insira uma nova linha. Na minha atual solução, isso é o que acontece ...

Conversion: 175/348 Seconds   |==========          |  50%
Conversion: 179/348 Seconds   |==========          |  52%
Conversion: 183/348 Seconds   |==========          |  54%
Conversion: 187/348 Seconds   |===========         |  56%

código que eu uso é ...

print "Conversion: $converted_seconds/$total_time Seconds   $progress_bar  $converted_percentage%\n";

Estou fazendo isso em Linux utilizando PHP (apenas vou usar o app - por isso, desculpa a escolha de idioma). Assim, a solução deve funcionar na plataforma Linux -. Mas se você tiver uma solução que é multi-plataforma, que seria preferível

Foi útil?

Solução

Eu não acho que você precisa pedir desculpas para a escolha do idioma. PHP é uma grande linguagem para aplicativos de console.

Tente isto:

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

O "\ r" irá substituir a linha com o novo texto. Para fazer uma nova linha que você pode apenas usar "\ n", mas eu estou supondo que você já sabia disso.

Espero que isso ajude! Eu sei que isso funciona em Linux, mas eu não sei se ele funciona em outros sistemas operacionais Windows ou.

Outras dicas

Para apagar um caractere previamente impresso você tem três opções:

  • echo chr(8) . " "; ecos o personagem de volta, e irá mover o cursor de volta um lugar, e o espaço, em seguida, substitui o personagem. Você pode usar chr(8) várias vezes em uma fila para voltar vários caracteres.

  • echo "\r"; irá retornar o cursor para o início da linha atual. Agora você pode substituir a linha com o novo texto.

  • A terceira opção é para definir a linha e coluna da posição do cursor usando códigos de escape ANSI, em seguida, imprimir os caracteres de substituição. Pode não funcionar com todos os terminais:

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

\ r fez o truque.

Para referência futura, \ b não funciona no PHP em Linux. Eu estava curioso - então eu fiz um par de experiências em outras línguas também (eu fiz isso em Linux - eu não sei se o resultado será o mesmo em Windows / Mac) ..

\ b Obras em ...

  • Perl
  • Rubi
  • Tcl - com puts -nonewline "Hello\b" código

\ b não funciona no

  • PHP - os print "Hello\b"; código imprime Hello\b
  • Python - print "Hello\b" código imprime Hello<new line>. Mesmo resultado com print "Hello\b",

Eu não tenho certeza se é o mesmo em Linux, mas no console do Windows aplicativos que você pode imprimir \ r e o cursor voltará para a primeira posição esquerda da linha que lhe permite sobrepor todos os caracteres à direita.

Você pode usar \ b para voltar um único personagem, mas uma vez que você vai estar atualizando sua barra de progresso \ r seria mais simples de usar do que a impressão \ b x número de vezes.

Este parece ser tema muito antigo, mas eu vou largar o meu 5 em.

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

Encontrado isso na internet há algum tempo, infelizmente não me lembro onde. Então, todos os créditos vão ao autor original.

para apagar um caractere previamente impresso, eu imprimir um retrocesso depois que: imprimir "a" imprimir "\ b"

imprimirá nada (na verdade, ele irá imprimir e, em seguida, um retrocesso, mas você provavelmente não vai notar que)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top