PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : printf() - überschreiben der letzten Ausgabe



musketaquid
14-02-2006, 20:46
Jetzt post ich aber im richtigen Forum, oder?
Ich hab aus Versehen schon in Scriptsprachen gepostet. :o Hier ist der Link:
http://www.mrunix.de/forums/showthread.php?t=43178

Also mit dem Wagenrücklauf, das hat geklappt, aber nur in einem kleinen Test-Programm. Im richtigen Programm muss ich mit sleep() arbeiten und da geht's halt nicht. Das Problem ist sleep(), es scheint die Zeile einfach zu löschen. Hier mal ein Beispiel um das Problem zu demonstrieren:

#include <stdio.h>

main()
{
int i, j, k;
i = j = k = 1;
printf("%.2d:%.2d:%.2d\n", i, j, k); /* mit Zeilentrenner */
sleep(1);
i = j = k = 2;
printf("\r%.2d:%.2d:%.2d", i, j, k);
}
Die Ausgabe sieht so aus:

01:01:01
02:02:02
Jetzt lass ich aber den Zeilentrenner weg, denn ich will, dass die Ausgabe an der gleichen Stelle erfolg:

#include <stdio.h>

main()
{
int i, j, k;
i = j = k = 1;
printf("%.2d:%.2d:%.2d", i, j, k); /* ohne Zeilentrenner */
sleep(1);
i = j = k = 2;
printf("\r%.2d:%.2d:%.2d", i, j, k);
}
Dann seh ich ne Sekunde lang gar nix, und dann das:

02:02:02
Was mach ich nur falch?

Joghurt
15-02-2006, 06:48
stdout ist gepuffert.
Schreib an stderr

ninguno
15-02-2006, 06:59
wie gesagt ausgabe auf stdout ist block buffered, du kannst den stream aber auch flushen
#include <stdio.h>

main()
{
int i, j, k;
i = j = k = 1;
printf("%.2d:%.2d:%.2d", i, j, k); /* ohne Zeilentrenner */
fflush(stdout);
sleep(1);
i = j = k = 2;
printf("\r%.2d:%.2d:%.2d", i, j, k);
}

musketaquid
15-02-2006, 15:29
Siehe da! Wenn ich auf stderr schreib, klappt's, und wenn ich fflush benutze, klappt's auch. :)
Super! Vielen Dank!

sticky bit
16-02-2006, 10:49
Alternativ gäbe es auch noch setbuf() womit man das Puffern für nen Stream ändern kann. Sollte auch für stdout gehen (nicht getestet)...