Frage

Ich erstelle eine kleine Konsole-Anwendung, die einen Fortschrittsbalken muss. So etwas wie ...

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

Meine Frage ist, wie löschen Sie Zeichen bereits auf der Konsole ausgegeben? Als ich den 51st Prozentsatz zu erreichen, muss ich diese Zeile von der Konsole löschen und eine neue Zeile einzufügen. In meiner aktuellen Lösung ist das, was passiert ...

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

-Code ich verwende, ist ...

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

ich dies in Linux mache mit PHP (nur werde ich die App nutzen - also bitte die Sprache Wahl entschuldigen). So soll die Lösung auf der Linux-Plattform arbeiten -. Aber wenn Sie eine Lösung, die Cross-Plattform ist, wäre das bevorzugt

War es hilfreich?

Lösung

Ich glaube nicht, dass Sie für die Sprache Wahl entschuldigen müssen. PHP ist eine großartige Sprache für Konsolenanwendungen.

Probieren Sie dies aus:

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

Die „\ r“ wird die Zeile mit dem neuen Text überschrieben. Um eine neue Zeile zu machen können Sie einfach „\ n“ verwenden, aber ich vermute, Sie bereits wusste.

Hope, das hilft! Ich weiß, das funktioniert in Linux, aber ich weiß nicht, ob es in Windows oder anderen Betriebssystemen funktioniert.

Andere Tipps

Zum Löschen eines zuvor gedruckten Zeichen Sie haben drei Möglichkeiten:

  • echo chr(8) . " "; erinnert an die Rückseite Charakter und wird den Cursor wieder einen Platz, und der Raum überschreibt dann den Charakter bewegen. Sie können chr(8) mehrere Male in einer Reihe verwenden, um mehrere Zeichen zu bewegen zurück.

  • echo "\r"; wird der Cursor an den Anfang der aktuellen Zeile zurück. Sie können nun die Zeile mit neuem Text ersetzen.

  • Die dritte Option ist die Zeile und Spalte der Cursorposition Flucht mit ANSI-Codes zu setzen, dann die Ersatzzeichen drucken. Es ist vielleicht nicht mit allen Terminals arbeiten:

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

\ r hat den Trick.

Für die Zukunft, \ b funktioniert nicht in PHP unter Linux. Ich war neugierig - so habe ich auch ein paar Experimente in anderen Sprachen (ich habe dies in Linux - ich weiß nicht, ob das Ergebnis wird das gleiche in Windows / Mac sein) ..

\ b Arbeiten in ...

  • Perl
  • Rubin
  • Tcl - mit Code puts -nonewline "Hello\b"

\ b Funktioniert nicht

  • PHP - der Code print "Hello\b"; ausdruckt Hello\b
  • Python - Code print "Hello\b" druckt Hello<new line>. Gleiches Ergebnis mit print "Hello\b",

Ich bin mir nicht sicher, ob es das gleiche in Linux ist aber in Windows-Konsole-Anwendungen können Sie \ r und der Cursor in die erste linke Position der Linie wird wieder gedruckt so dass Sie alle Zeichen auf der rechten Seite zu überschreiben.

Sie können \ b verwenden, um ein einzelnes Zeichen zu bewegen zurück, aber da Sie gehen Ihre Fortschrittsbalken \ r zu aktualisieren einfacher wäre zu verwenden, als \ b x-mal gedruckt wird.

Das scheint ziemlich altes Thema zu sein, aber ich werde fallen mein 5 in.

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

Sie haben diese im Internet vor einiger Zeit erinnern, leider nicht, wo. Also alle Kredite geht an ursprünglichen Autor.

ein zuvor gedruckten Zeichen zu löschen, drucke ich eine Backspace nachdem es: print "a" print "\ b"

druckt nichts (tatsächlich wird es drucken und dann ein Rückschritt, aber Sie werden wahrscheinlich nicht bemerken)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top