Archiv verlassen und diese Seite im Standarddesign anzeigen : hochzählende Statusanzeige
BLUESCREEN3D
15-08-2005, 19:08
Wenn man in der Ausgabe eines Programmes eine hochzählende Statusanzeige, z. B. mit einem Prozentwert, haben will, dann muss bei jeder neuen Anzeige der vorherige Wert auf dem Bildschirm überschrieben werden.
Durch die Ausgabe des Backspace-Zeichens \b funktioniert dies auch ganz gut.
Einfachstes Beispiel in C:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned char i;
printf("Status: 0%%"); /* Anfangswert ausgeben */
fflush(stdout);
for(i=10;i<=100;i+=10)
{
sleep(1);
printf("\b\b\b\b"); /* Cursor vier Zeichen zurückbewegen */
printf("%3u%%",i); /* neuen Wert ausgeben */
fflush(stdout);
}
printf("\n");
return(EXIT_SUCCESS);
}
Meine Fragen dazu:
Gibt es auch Fälle in denen das in der Console falsch angezeigt wird, oder kann man sich sicher sein, dass das mit der Ausgabe des \b immer gut funktioniert?
Wie sieht es mit der Umleitung der Ausgabe in eine Datei aus - kann man da verhindern, dass alle Prozentwerte inklusive der ganzen \b gespeichert werden?
Gibt es einen anderen Weg für so eine Anzeige, ohne gleich (n)curses verwenden zu müssen?
Thomas Engelke
16-08-2005, 09:36
Hallo!
Leider kann man sich nicht sicher sein, daß ein \b gut funktioniert. Dafür muß das Terminal IMHO Ansi-Sequenzen auswerten können. Ich habe schon oft vor furchtbaren Inhouse-Terminal-Lösungen für Unixe gesessen, bei denen weder Backspace noch Cursorbewegungen oder auch nur der Aufruf der letzten Kommandozeile funktionierten. Auf einem solchen Terminal würde dies meines Erachtens auch fehlschlagen.
Dies liegt zum großen Teil daran, daß Ausgaben üblicherweise sogenannte Streams sind. Ein Strom von Zeichen, der zu einem beliebigen Ziel geleitet wird. Problematisch dabei ist folgendes: Man stelle sich vor, der Stream wird sozusagen "Realtime" an einen Drucker geleitet. Der Drucker druckt also fleißig die Zeichen mit und stößt auf ein \b. Soll er jetzt zurückscrollen? Ein Strom kann nicht rückwärts laufen.
nCurses ist für genau solche Probleme geschaffen und melden dir IMHO auch zurück, falls das genutzte Terminal nicht ANSI-fähig ist, so daß du dich darum auch nicht kümmern müßtest.
TME
Vor allem ist ncurses nicht sehr schwer zu erlernen. Ich pack mal zwei meiner Sourcen in den Anhang, mit denen es ein bisschen einfacher ist, Fenster-Oberflächen - und damit evtl. auch solche Ausgaben - darzustellen.
BLUESCREEN3D
16-08-2005, 12:02
Danke, aber in kleinen Tools curses zu benutzen finde ich etwas übertrieben.
Warum? Wird doch eh dynamisch zugelinkt. Und da es bestandteil des Systems ist, ist es doch kein Problem. Übertrieben ist es nicht, finde ich.
\b ist keine ANSI-Sequenz, das sollte eigentlich überall gehen. (Dort, wo es nicht geht, wird curses auch nicht helfen können)
Statusanzeigen würde ich eigentlich immer an stderr senden, das hat den Vorteil, dass
1. Die Ausgabe ungepuffert ist
2. Sie dir nicht die Dateien zumüllt, wenn du nur stdout umlenkst.
Thomas Engelke
17-08-2005, 10:29
\b ist keine ANSI-Sequenz, das sollte eigentlich überall gehen. (Dort, wo es nicht geht, wird curses auch nicht helfen können)
Asche auf mein Haupt. Hast du ggf. mal eine Referenz, was unter "normale" Steuerzeichen und was unter ANSI-Sequenzen fällt?
TME
Alles, was mit ESC (0x1b) beginnt, sind Steuersequenzen, die ANSI-Sequenzen haben glaube ich alle die Form ESC [ kommando
man console_codes
BLUESCREEN3D
17-08-2005, 19:59
Wird doch eh dynamisch zugelinkt.
Und wenn doch mal keine curses-lib da ist (minimalistisches Rettungssystem z.B.) funzt es gleich nicht mehr...
\b ist keine ANSI-Sequenz, das sollte eigentlich überall gehen. (Dort, wo es nicht geht, wird curses auch nicht helfen können)
Jo, mir fällt gerade auf, dass ein einzelnes Byte nie eine Sequenz sein könnte - thx
Statusanzeigen würde ich eigentlich immer an stderr senden, das hat den Vorteil, dass
1. Die Ausgabe ungepuffert ist
2. Sie dir nicht die Dateien zumüllt, wenn du nur stdout umlenkst.
Ich würde stderr eigentlich nur für Fehlermeldungen benutzen - heißt ja nicht umsponst stdERR :D
Oder gibt es irgendwo Empfehlungen, was man am besten wo ausgeben sollte?
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.