Question

Je crée une petite application console qui nécessite une barre de progression. Quelque chose comme ...

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

Ma question est la suivante: comment effacer les caractères déjà imprimés sur la console? Quand j'atteins le 51ème pourcentage, je dois effacer cette ligne de la console et insérer une nouvelle ligne. Dans ma solution actuelle, voici ce qui se passe ...

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

Le code que j'utilise est ...

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

Je le fais sous Linux en utilisant PHP (seulement je vais utiliser l'application - alors veuillez excuser le choix de la langue). La solution devrait donc fonctionner sur la plate-forme Linux - mais si vous avez une solution multiplate-forme, ce serait préférable.

Était-ce utile?

La solution

Je ne pense pas que vous ayez besoin de vous excuser pour le choix de la langue. PHP est un excellent langage pour les applications en console.

Essayez ceci:

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

Le " \ r " va écraser la ligne avec le nouveau texte. Pour créer une nouvelle ligne, vous pouvez simplement utiliser & "; \ N &"; Mais je suppose que vous le saviez déjà.

J'espère que ça aide! Je sais que cela fonctionne sous Linux, mais je ne sais pas si cela fonctionne sous Windows ou sous d'autres systèmes d'exploitation.

Autres conseils

Pour effacer un caractère précédemment imprimé, vous avez trois options:

  • echo chr(8) . " "; renvoie le caractère précédent, déplace le curseur d’un endroit vers l’autre et l’espace remplace le caractère. Vous pouvez utiliser chr(8) plusieurs fois de suite pour revenir en arrière de plusieurs caractères.

  • echo "\r"; ramènera le curseur au début de la ligne en cours. Vous pouvez maintenant remplacer la ligne par un nouveau texte.

  • La troisième option consiste à définir la ligne et la colonne de la position du curseur à l'aide de codes d'échappement ANSI, puis à imprimer les caractères de remplacement. Cela pourrait ne pas fonctionner avec tous les terminaux:

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

\ r a fait le tour.

Pour référence future, \ b ne fonctionne pas en PHP sous Linux. J'étais curieux - j'ai donc fait quelques expériences dans d'autres langues également (je l'ai fait sous Linux - je ne sais pas si le résultat sera le même sous Windows / Mac) ..

\ b Fonctionne dans ...

  • Perl
  • Ruby
  • Tcl - avec le code puts -nonewline "Hello\b"

\ b Ne fonctionne pas dans

  • PHP - le code print "Hello\b"; affiche Hello\b
  • Python - code print "Hello\b" affiche Hello<new line>. Même résultat avec print "Hello\b",

Je ne suis pas sûr que ce soit la même chose sous Linux, mais dans les applications pour console Windows, vous pouvez imprimer et le curseur reviendra à la première position à gauche de la ligne, vous permettant ainsi d'écraser tous les caractères à droite.

Vous pouvez utiliser \ b pour revenir d’un caractère à l’autre mais, étant donné que vous allez mettre à jour votre barre de progression, il serait plus simple de l’utiliser que d’imprimer \ b x nombre de fois.

Cela semble être un sujet assez ancien, mais je vais laisser tomber mon 5 dans.

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

Trouvé ceci sur Internet il y a quelque temps, malheureusement, je ne me souviens plus où. Tous les crédits vont donc à l'auteur original.

pour effacer un caractère précédemment imprimé, j'imprime un retour arrière après celui-ci: affiche & "; un &"; imprimer " \ b "

imprimera rien (en fait, il imprimera puis un retour arrière, mais vous ne le remarquerez probablement pas)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top