Konsolenausgabe mit Pipe an mtee erst nach Programmbeendigung?!

12/03/2009 - 11:44 von Maximilian Schenker | Report spam
Hallo zusammen,

ich habe eine kleine Win32-Konsolenanwendung mit C++ geschrieben. Einzeln
funktioniert alles wunderbar. Nun möchte ich die Ausgaben in einer
Batch-Datei sowohl auf dem Bildschirm, als auch in einer Logdatei haben.
Dazu leite ich alles an mtee.exe weiter. Mit allen Batch-Befehlen klappt das
wunderbar, nur mit meinem Programm nicht. Die Ausgabe erscheint erst, wenn
das Programm beendet wurde und dann alles auf einen Rutsch. Das Windows
Programm "timeout.exe" verhàlt sich übrigens identisch!

Ich habe auch schon andere "tee" Programme getestet und ein tee.vbs. Überall
gleich. Erst nach dem Programmende steht alles auf einmal auf dem Schirm.
Wirklich seltsam.

Dann habe ich testweise ein altes 16-Bit-DOS-Programm, welches ich vor
langer Zeit mal in Turbo Pascal 7.0 geschrieben hatte, getestet und bei
diesem funktioniert die Ausgabe einwandfrei und verzögerungsfrei! Jetzt
vermute ich, dass die Win32-Konsolenanwendung irgendetwas anders in der
Ausgabe macht...

Vielleicht könnt ihr mir da einen Tipp geben, was ich tun kann? Vielleicht
den Ausgabemodus irgendwie umschalten. Ein "printf" statt "cout" hilft
leider nicht (gleiches Ergebnis).

Gruß,
Max
 

Lesen sie die antworten

#1 Jochen Kalmbach [MVP]
12/03/2009 - 13:27 | Warnen spam
Hi Maximilian!

ich habe eine kleine Win32-Konsolenanwendung mit C++ geschrieben. Einzeln
funktioniert alles wunderbar. Nun möchte ich die Ausgaben in einer
Batch-Datei sowohl auf dem Bildschirm, als auch in einer Logdatei haben.
Dazu leite ich alles an mtee.exe weiter. Mit allen Batch-Befehlen klappt das
wunderbar, nur mit meinem Programm nicht. Die Ausgabe erscheint erst, wenn
das Programm beendet wurde und dann alles auf einen Rutsch.



Per default ist in der CRT das "buffering" aktiviert (4KB). Erst wenn
dieser Buffer voll ist oder etwas auf die _Console_ ausgegeben werden
soll, wird tatsàchlich etwas geschrieben.

Siehe: Stream I/O
http://msdn.microsoft.com/en-us/lib...5h7xx.aspx

<quote>
The stdout and stderr functions are flushed whenever they are full or,
if you are writing to a character device, after each library call. If a
program terminates abnormally, output buffers may not be flushed,
resulting in loss of data.
</quote>


Um das Problem zu umgehen, hast Du Folgende Möglichkeiten:

- flushe explizit die Ausgabe am Ende: fflush(stdout); fflush(stderr);
- deaktiviere das Buffering am Anfang: setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);


PS: Eine bessere Gruppe für "native C/C++" Fragen ist
news:microsoft.public.de.vc

Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/

Ähnliche fragen