[dasmussso] Keine Ausgabe bei cout in Konsole, Umleitung in Datei funktioniert dagegen tadellos
-
Hallo zusammen,
ich habe ein Programm vor mir, das mich strikt monoton steigend zur Weißglut treibt.Der Quellcode ist historisch gewachsen, wobei das Programm selbst grundsätzlich macht, was es soll.
Nun habe ich an den Anfang eine banale Möglichkeit zur Abfrage der Version setzen wollen. Doch selbst wenn ich die
main.cppauf folgenden Schnipsel kürze und in der KonsoleProgramm.exe -vaufrufe, sehe ich nada. Wenn ich die Ausgabe dagegen in eine Datei umleite (Programm.exe -v > out.txt), erhalte ich alles.#include <iostream> int main( int argc, char *argv[] ) { // print version if( argc == 2 ) { std::string sArg( argv[1] ); if( sArg.compare( "-v" ) == 0 ) { std::cout << "\n>>> Program version 3.5\n" << std::endl; return 0; } } }Ich suche seit gut drei Stunden, aber finde nur Beiträge, wo Leute kein
\noderendlverwenden und die Ausgabe deshalb gepuffert und nicht angezeigt wird. %SUCHMASCHINE% schlägt mir auch tausende Beiträge vor, wie mancoutundcerrin Dateien umlenkt, usw. Alles nur Treffer, die mich nicht weiterbringen.Es handelt sich um ein Programm, das u.a. auch Qt nutzt. In einem Suchergebnis war davon die Rede, dass Qt
coutirgendwie umbiegt und man Ausgaben an die Konsole mittelsQTextStream(stdout)möglich seien. Das finde ich jetzt mäßig charmant.Ich frage mich an der Stelle, ob ich
coutnicht einfach neu aufsetzen (reinitialisieren) kann. Mir ist völlig egal, was Qt für Pläne mitcouthat. Wenn ichcoutnutze, erwarte ich eine Ausgabe an die Konsole. Leider kenne ich die Mechanik dahinter nicht so gut und brauche Hilfe.Oder gibt es eine Einstellung in Qt, Visual Studio (2010) oder eine Präprozessordefinition, die hier die Finger im Spiel haben könnte und Ausgaben an die Konsole unterbindet? (Die beiden genannten Definitionen sind vorhanden, scheinbar auch nicht grundlos).
Viele Grüße
gelignite
-
Tritt der Fehler schon bei dem gezeigten Beispiel auf oder nur wenn Qt im Spiel ist? Ich benutze Qt nicht, könnte mir aber schon vorstellen, dass die cout umbiegen.
-
gelignite schrieb:
Doch selbst wenn ich die
main.cppauf folgenden Schnipsel kürze und in der KonsoleProgramm.exe -vaufrufe, sehe ich nada.Ich nehme das VS-Projekt und kürze darin die
main.cppauf den gezeigten Inhalt.In der Projektmappe befindet sich noch ein zweites Projekt. Dort tritt das Phänomen nicht auf.
-
Merke dir den streambuf mittels cout.rdbuf() bevor Qt diesen umbiegt und setze ihn vor deiner cout-Ausgabe wieder zurück, s.a. Resetting the cout after redirection
-
Dein Programm wird wohl als WIN32 Anwendung übersetzt. Die machen kein Konsolen-output. COUT kann aber problemlos umgeleitet werden.
mfg Martin
-
Th69 schrieb:
Merke dir den streambuf mittels cout.rdbuf() bevor Qt diesen umbiegt und setze ihn vor deiner cout-Ausgabe wieder zurück, s.a. Resetting the cout after redirection
Hab's probiert, klappt nicht.
#include <iostream> int main( int argc, char *argv[] ) { // grab stream before someone modifies it auto oldbuf = std::cout.rdbuf(); // print version if( argc == 2 ) { std::string sArg( argv[1] ); if( sArg.compare( "-v" ) == 0 ) { // (re)set stream to previously saved value std::cout.rdbuf( oldbuf ); std::cout << "\n>>> Program version 123\n" << std::endl; return 0; } } return 0; }Immer noch gähnende Leere in der Konsole.

mgaeckler schrieb:
Dein Programm wird wohl als WIN32 Anwendung übersetzt.Die machen kein Konsolen-output.
Korrekt, das Projekt ist eine Win32-Anwendung mit GUI.
mgaeckler schrieb:
COUT kann aber problemlos umgeleitet werden.
Siehe vorstehender Schnipsel - so geht die Umleitung schon mal nicht. Wie kann es umgeleitet, dass es geht? Wie eingangs erwähnt, kenne ich die Mechanik hinter dem Ganzen nicht. Naiv gedacht brauche ich einen passenden
std::streambuf*(?), der meine Ausgabe in die Konsole malt. Aber wie sieht der aus? Ein kurzer Blick ins WWW zeigt eher kryptische Sachen, z.B. Adding Console I/O to a Win32 GUI App. Da bekommt man ja gleich Lust auf mehr.Viele Grüße
gelignite
-
gelignite schrieb:
mgaeckler schrieb:
Dein Programm wird wohl als WIN32 Anwendung übersetzt.Die machen kein Konsolen-output.
Korrekt, das Projekt ist eine Win32-Anwendung mit GUI.
mgaeckler schrieb:
COUT kann aber problemlos umgeleitet werden.
Siehe vorstehender Schnipsel - so geht die Umleitung schon mal nicht. Wie kann es umgeleitet, dass es geht? Wie eingangs erwähnt, kenne ich die Mechanik hinter dem Ganzen nicht. Naiv gedacht brauche ich einen passenden
std::streambuf*(?), der meine Ausgabe in die Konsole malt. Aber wie sieht der aus? Ein kurzer Blick ins WWW zeigt eher kryptische Sachen, z.B. Adding Console I/O to a Win32 GUI App. Da bekommt man ja gleich Lust auf mehr.Viele Grüße
gelignite- Ich habe eine normale WINAPI-Anwendung geändert und via cout etwas ausgegegeben.
- Die Anwendung habe ich aus der Eingabeausforderung gestartet.
- habe nichts gesehen. Der Prompt kam aber sofort wieder, obwohl das Programm noch lief.
- Anwendung nun mit xxx.exe >test.txt gestartet.
- Wieder nichts gesehen, Prompt kam wieder sofort wieder, Ausgabe wurde aber nun in Datei geschrieben.
Das Verhalten hat also nichts mit QT zu tun.
mfg Martin
-
*ieks* ein Missverständnis, da hatte ich was falsch verstanden. Ich hatte hier
mgaeckler schrieb:
COUT kann aber problemlos umgeleitet werden.
angenommen, dass man an
std::coutwas ändern kann, damit es doch in die Konsole schreibt. Mein Fehler.Ne, also, deine Beschreibung ist exakt meine Beobachtung. In der Konsole kommt nichts, aber die Umleitung der Ausgabe via
>in eine Datei fördert die Ausgaben zu Tage.Nun ja. Ich hatte gerade noch ein wenig weiter gesucht und gelesen. Eine Antwort war z.B. auch "You can't really". Ich denke, ich folge der 80:20-Regel und lebe damit, dass die Ausgabe in einer Datei landen wird.
Danke für den Hinweis, dass WIN32-Anwendungen nicht in die Konsole schreiben. Da hätte ich sonst wohl noch länger gesucht.
Viele Grüße
gelignite
-
AllocConsole
oder
AttachConsoleDamit siehst du dann was. Funktioniert dann aber nicht ganz so wie man es von Konsolenprogrammen erwartet -- wenn du wissen willst was ich meine: einfach ausprobieren

Wenn du aber nur was sehen willst, dann sollteAllocConsolereichen.Oder das Programm einfach auf Konsolenanwendung umstellen, und in Fällen wo du die Konsole weg haben willst einfach ReleaseConsole aufrufen.