Ich programmiere eine Aufgabenüberwachung, die den Fortschritt von Aufgaben mit Hilfe von cout aktualisiert. Ich möchte einen Aufgabenfortschritt pro Zeile anzeigen, daher muss ich mehrere Zeilen der Konsole zurücksetzen.
Ich bestehe auf "mehrere", weil \b
den Job für eine Zeile ausführt, aber \n
nicht zwischen Zeilen löscht.
Ich habe std::cout.seekp(std::cout.tellp() - str.length());
versucht, aber tellp()
gibt -1 (Fehler) zurück.
Sie können cout << '\r';
verwenden, um zum Anfang der aktuellen Zeile zu springen, aber aufwärts zu gehen ist systemspezifisch. Unter Unix finden Sie man termcap
und man terminfo
(und suchen nach cursor_up
). Auf ANSI-kompatiblen Terminals (wie den meisten modernen Terminals, die unter Unix verfügbar sind) funktioniert das nach oben: cout << "\e[A";
.
Versuchen Sie nicht in cout
zu suchen, es ist die meiste Zeit nicht erreichbar (außer wenn Sie in eine Datei umgeleitet werden).
Wie in anderen Antworten erwähnt, bietet die Verwendung der Bibliothek ncurses (oder slang ) eine gute Abstraktion für Terminal-E / A unter Unix.
Weder C noch C ++ definieren so etwas. Sie benötigen explizite Terminalmanipulation. Unter Unix können Sie curses verwenden. Hab keine Ahnung, was es für Windows gibt.
Ich weiß, dass es sich um einen alten Post handelt, aber das Akzeptierte deckt keine Fälle ab, in denen Cout an ein Programm oder eine Datei weitergeleitet wird, und dies ist der Anfang meiner Google-Suche. Im Folgenden werden Pipe und nicht gepowerte Stdout mit etwas anderem Verhalten behandelt.
%Vor%Dies ist unter Windows nicht getestet, sollte aber funktionieren. Was es tut, ist festzustellen, ob der Dateideskriptor oder ein TTY ist. Wenn es dann ist, schreibt es einfach "\ r", wenn sich die Pos nicht geändert hat, seit es das letzte Mal gedruckt wurde, oder ein Zeilenumbruch. Wenn es kein Zeilenumbruch ist, sucht es den letzten Ort, an dem es gedruckt wurde.
Es verhält sich für Dateien anders als für tty. Wenn bei einer Datei etwas zwischen den Abzügen in den Stream ausgegeben wird, kann es einige oder alles überschreiben, was selbst nach Zeilenumbrüchen geschrieben wurde. Für ttys überschreibt es einfach die Zeichen am Anfang der aktuellen Zeile.