it-swarm.com.de

Ausgabe auf der Konsole in C++/Windows

Bei Verwendung von iostream in C++ unter Linux wird die Programmausgabe im Terminal angezeigt. Unter Windows speichert sie die Ausgabe jedoch nur in einer Datei stdout.txt. Wie kann ich die Ausgabe in Windows in der Konsole anzeigen lassen?

14
Xunil

Da Sie stdout.txt erwähnt haben, habe ich google'd, um zu sehen, was genau eine stdout.txt erzeugen würde. Normalerweise geht die Konsolenausgabe auch bei einer Windows-App an die zugewiesene Konsole oder nirgendwo, wenn keine zugewiesen ist.

Vorausgesetzt, Sie verwenden SDL (was die einzige Sache ist, die stdout.txt aufgerufen hat), sollten Sie den Ratschlägen hier folgen. Entweder freopen stdout und stderr mit "CON" oder führen Sie die anderen Linker/Compilier-Workarounds aus.

Falls der Link erneut unterbrochen wird, ist hier genau das, worauf in libSDL verwiesen wurde: 

Wie vermeide ich die Erstellung von stdout.txt und stderr.txt?

"Ich glaube, in dem Visual C++ - Projekt, das mit SDL geliefert wird, gibt es ein SDL_nostdio-Ziel, das Sie erstellen können, was Sie wollen (TM)."

"Wenn Sie" NO_STDIO_REDIRECT "definieren und SDL erneut kompilieren, denke ich, dass es das Problem beheben wird." >> (Antwort mit freundlicher Genehmigung von Bill Kendrick)

16
MSN

Sie können einer Windows-Anwendung ohne Konsole eine Konsole hinzufügen, indem Sie den unter Hinzufügen einer Konsolen-E/A zu einer Win32-GUI-App beschriebenen Vorgang ausführen.

Es gibt einen ganzen Thread auf gamedev.net zum Thema.

13
luke

Zum Debuggen in Visual Studio können Sie in der Debug-Konsole drucken:

OutputDebugStringW(L"My output string.");
7
Sean

Wenn Sie eine Windows-Anwendung ohne Konsole haben, können Sie eine Konsole mit der Funktion AllocConsole erstellen. Einmal erstellt, können Sie mit den normalen Methoden von std :: cout schreiben. 

5
anon

Zunächst einmal, welche Compiler- oder Entwicklungsumgebung verwenden Sie? Bei Visual Studio müssen Sie ein Konsolenanwendungsprojekt erstellen, um die Konsolenausgabe zu erhalten.

Zweite,

std::cout << "Hello World" << std::endl;

sollte in jeder C++ - Konsolenanwendung funktionieren.

4
crashmstr

Wenn Sie Visual Studio verwenden, müssen Sie die Eigenschaft project ändern: Konfigurationseigenschaften -> Linker -> System -> SubSystem.

Dies sollte auf Folgendes gesetzt werden: Konsole (/ SUBSYSTEM: CONSOLE)

Sie sollten auch Ihren WinMain ändern, um diese Signatur zu erhalten:

int main(int argc, char **argv)
{
    //...
    return 0;
}
4
Brian R. Bondy

Die Funktion AllocConsole Windows API erstellt ein Konsolenfenster für Ihre Anwendung.

4
jeffm

Wenn Sie Visual Studio verwenden, sollte dies problemlos funktionieren!

Hier ist ein Codebeispiel:

#include <iostream>

using namespace std;

int main (int) {
    cout << "This will print to the console!" << endl;
}

Stellen Sie sicher, dass Sie eine Win32-Konsolenanwendung ausgewählt haben, wenn Sie ein neues Projekt erstellen. Sie können jedoch die Ausgabe Ihres Projekts mithilfe des Console-Switches (>>) in eine Datei umleiten. Dadurch wird die Pipe der Konsole tatsächlich vom stdout zu Ihrer Datei umgeleitet. (zum Beispiel myprog.exe >> myfile.txt).

Ich wünschte, ich liege nicht falsch!

3
Galilyou

Ihre Anwendung muss als Windows-Konsolenanwendung kompiliert werden.

2
spoulson

Ob Subsystem: Konsole oder Subsystem verwendet wird: Windows hängt davon ab, wie Sie Ihre Anwendung starten möchten:

  • Wenn Sie das Subsystem: Console verwenden, werden alle Standardausgänge auf das Terminal geschrieben. Das Problem ist, dass, wenn Sie die Anwendung vom Startmenü/Desktop aus starten, (standardmäßig) eine Konsole sowie das Anwendungsfenster (das ziemlich hässlich aussehen kann) angezeigt werden.
  • Wenn Sie das Subsystem: windows verwenden, erhalten Sie stdout/stderr nicht, auch wenn Sie die Anwendung von einem DOS - Fenster, Cygwin oder einem anderen Terminal aus ausführen.

Wenn Sie möchten, dass der mittlere Weg auf dem Terminal ausgegeben wird, wenn die Anwendung in einem Terminal gestartet wurde, folgen Sie dem Link, den Luke in seiner Lösung angegeben hat ( http://dslweb.nwnexus.com/~ast/dload/ guicon.htm )

Zu Referenzzwecken bin ich auf dieses Problem mit einer Anwendung gestoßen, die ich entweder im normalen Windows-Modus oder im Stapelmodus (dh als Teil eines Skripts) ausführen möchte, je nach Befehlszeilenoptionen. Die ganze Unterscheidung zwischen Konsolen- und Windows-Anwendungen ist für Unix-Leute etwas bizarr!

2
AJ.

Ich gehe davon aus, dass Sie eine Version von Visual Studio verwenden. In Windows sollte std::cout << "something"; etwas in ein Konsolenfenster schreiben, WENN Ihr Programm in den Projekteinstellungen als Konsolenprogramm eingerichtet ist.

1
Rob K

Sie müssen nicht unbedingt Änderungen an Ihrem Code vornehmen (oder den Typ SUBSYSTEM ändern). Wenn Sie möchten, können Sie auch einfach pipe stdout und stderr zu einer Konsolenanwendung (eine Windows-Version von cat funktioniert gut).

0
jamesdlin

Es gibt eine gute Lösung

if (AllocConsole() == 0)
{
    // Handle error here. Use ::GetLastError() to get the error.
}

// Redirect CRT standard input, output and error handles to the console window.
FILE * pNewStdout = nullptr;
FILE * pNewStderr = nullptr;
FILE * pNewStdin = nullptr;

::freopen_s(&pNewStdout, "CONOUT$", "w", stdout);
::freopen_s(&pNewStderr, "CONOUT$", "w", stderr);
::freopen_s(&pNewStdin, "CONIN$", "r", stdin);

// Clear the error state for all of the C++ standard streams. Attempting to accessing the streams before they refer
// to a valid target causes the stream to enter an error state. Clearing the error state will fix this problem,
// which seems to occur in newer version of Visual Studio even when the console has not been read from or written
// to yet.
std::cout.clear();
std::cerr.clear();
std::cin.clear();

std::wcout.clear();
std::wcerr.clear();
std::wcin.clear();
0
YuryChu

Wenn Sie MinGW verwenden, fügen Sie eine Option -Wl,subsystem,console oder -mconsole hinzu.

0
Jarekczek