it-swarm.com.de

Visual Studio - Wie kann ich die Cout-Ausgabe in einer Nicht-Konsolenanwendung anzeigen?

Es scheint ziemlich mühsam, im Debug-Fenster auszugeben. Wo finde ich die Ausgabe von cout, wenn ich Nicht-Konsoleninformationen schreibe?

Mögen:

double i = a / b;
cout << b << endl;//I want to check out whether b is zero. It seems the output cannot be found anywhere.
25
CDT

Verwenden Sie OutputDebugStringA, um eine Zeichenfolge an die Debug-Konsole auszugeben. Siehe http://msdn.Microsoft.com/en-us/library/windows/desktop/aa363362%28v=vs.85%29.aspx

Um Variablenwerte mit std::ostringstream An die Debug-Konsole auszugeben, senden Sie die Zeichenfolge an OutputDebugStringA.

Übermäßige Ausgaben führen zu einer starken Verlangsamung des Programms. Es ist jedoch eine gute Technik, Dinge zu erfassen, mit denen der Debugger ein Problem hat, z. B. die tatsächlichen untergeordneten Elemente beim Spielen mit Basiszeigern.

10
Thomas Matthews

Die Frage ist sehr klar. Verwendung von std :: cout zum Debuggen einer Nicht-Konsolenanwendung in Visual Studio.

Die Antwort ist sehr klar: Sie können nicht. Das heißt, Visual Studio unterstützt std :: cout nicht als Debug-Tool für Nicht-Konsolenanwendungen.

Dies ist eine schwerwiegende Einschränkung von Visual Studio, die möglicherweise sogar den C++ - Standard nicht erfüllt. Ich finde es sehr traurig, hier desinformative "Antworten" zu sehen, die versuchen, diesen Defekt ihres wertvollen Visual Studio zu verbergen.

87

Für eine Windows-Lösung können Sie eine Konsole zuweisen und cout/cin daran binden. Beispielsweise:

AllocConsole();
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);  

Dokumentation:
https://msdn.Microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx

27
Trevor Hickey

LÖSUNG: Diese Antwort löst die Frage und ermöglicht es Ihnen, die Konsolenausgabe in das Visual Studio-Ausgabefenster umzuleiten. Zuerst benötigen wir eine Klasse, die den Standard-Cout-String-Stream überschreibt:

class dbg_stream_for_cout
    : public std::stringbuf
{
public:
    ~dbg_stream_for_cout() { sync(); }
    int sync()
    {
        ::OutputDebugStringA(str().c_str());
        str(std::string()); // Clear the string buffer
        return 0;
    }
};
dbg_stream_for_cout g_DebugStreamFor_cout;

Dann möchten Sie irgendwo das Schreiben in das VS-Ausgabefenster "aktivieren":

std::cout.rdbuf(&g_DebugStreamFor_cout); // Redirect std::cout to OutputDebugString!
9
Luc Bloom

Anstatt cout zu verwenden, erstellen Sie eine Protokolldatei und schreiben Sie alles, was Sie wollen.

Bearbeiten: Verwenden Sie diesen einfachen Code zum Schreiben in eine Protokolldatei.

ofstream log;
log.open ("log.txt");
log << "Writing this to a file.\n";
log.close();
3
AliBZ

Verwenden Sie einfach std :: cin.get () am Ende Ihres Codes, z.

std::cout << "print this" << std::endl;
std::cin.get();

Dadurch bleibt das Programm geöffnet und wartet auf Benutzereingaben.

Funktioniert bei mir sowieso. Das Guthaben geht an TheChernoProject: https://www.youtube.com/channel/UCQ-W1KE9EYfdxhL6S4twUNw

2
Beko

Ich möchte meine 2 Cent geben.

In Anbetracht der Tatsache, dass es sich möglicherweise um ein VS-Problem bezüglich der Konformität mit dem C++ - Standard handelt oder dass wir OutputDebugStringA verwenden könnten, könnte Ihnen die Idee gefallen, das std :: cout einfach auf etwas anderes umzuleiten, wenn Sie Ihre Codebasis nicht ändern können. wie eine Akte.

Ohne die Codebasis zu ändern, können Sie also Folgendes tun: Wie leite ich cin und cout in Dateien um?

Kondensiert:

  • füge das Include #include <fstream> hinzu
  • zu Beginn Ihrer App können Sie in einigen Init vor der Protokollierung Folgendes verwenden:
std::ofstream out("out.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
  • das am Ende deiner App/Protokollierung:

std :: cout.rdbuf (coutbuf); // wieder auf Standardausgabe zurücksetzen

Hoffe das kann jemandem helfen, Kudos zu Nawaz, der die Antwort im anderen Thread lieferte.

2
Stefano Buora