Ich würde sagen, dass eine Bibliothek wie ncurses an solche Dinge gewöhnt wäre. Curses hilft dabei, den Cursor auf dem Bildschirm zu bewegen und Text und dergleichen zu zeichnen.
NCurses
Etwa so:
std::stringstream out;
for (int i = 0; i< 10; i++)
{
out << "X";
cout << "\r" << "[" << out.str() << "]";
}
Das hinterhältige Bit ist das Carriage-Return-Zeichen "\r", das bewirkt, dass der Cursor zum Anfang der Zeile springt, ohne zur nächsten Zeile zu gehen.
Andere haben bereits darauf hingewiesen, dass Sie 01
verwenden können um zum Anfang der aktuellen Zeile zurückzukehren und die gesamte Zeile zu überschreiben.
Eine andere Möglichkeit besteht darin, das Backspace-Zeichen ("\b") zu verwenden, um einige Leerzeichen zu löschen und nur diese Leerzeichen zu überschreiben. Dies kann einige Vorteile haben. Erstens vermeidet es offensichtlich, dass alles in der Leitung regeneriert werden muss, was manchmal leicht schmerzhaft sein kann (obwohl das ziemlich ungewöhnlich ist). Zweitens kann es einige Probleme beim Anzeigen von Daten vermeiden, die (zum Beispiel) beim Schreiben schrumpfen – zum Beispiel, wenn Sie einen Countdown von 100 bis 0 mit 19
Sie müssen vorsichtig sein, nicht die gesamte vorherige Länge zu überschreiben, oder Ihr Countdown geht (zum Beispiel) von 100 auf 990 (d. h. die vorherige "0" bleibt intakt).
Beachten Sie jedoch, dass die Rücktaste innerhalb einer Zeile zwar normalerweise funktioniert, eine Rücktaste am Anfang einer Zeile den Cursor/die Schreibposition jedoch möglicherweise auf eine vorherige Zeile zurückbewegt oder nicht. Aus praktischen Gründen können Sie sich nur innerhalb einer einzigen Zeile bewegen.
versuchen Sie es mit 27
statt 30
beim Drucken der neuen "Version".
for(int i=0;i<=100;++i) printf("\r[%3d%%]",i);
printf("\n");