Wenn ich ein natives C++ - Windows-Programm habe (d. H. Der Einstiegspunkt ist WinMain), wie sehe ich Ausgabe von Konsolenfunktionen wie Std :: Cout?Wie bekomme ich Konsolenausgabe in C++ mit einem Windows-Programm?
Antwort
Da ist kein Konsolenfenster, das ist
unmöglich
schwierig. (Lernen Sie jeden Tag etwas Neues - ich wusste nie etwas über die Konsolenfunktionen!)
Ist es möglich, dass Sie Ihre Ausgabeaufrufe ersetzen? Ich werde oft TRACE oder OutputDebugString verwenden, um Informationen an das Visual Studio-Ausgabefenster zu senden.
Eigentlich ist es möglich, aber schwierig, ein Konsolenfenster für Programme zu erhalten, die den Einstiegspunkt WinMain() anstelle von main() verwenden. –
@ChrisCharabaruk: Es ist nicht wirklich schwierig, [AllocConsole] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms681944.aspx) aufzurufen. Dies wird unter [Erstellen einer Konsole] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682528.aspx) erklärt. Außerdem steuert der Name des vom Benutzer bereitgestellten Einstiegspunkts nicht die Erstellung einer Konsole. Es ist der PE-Headereintrag für das Subsystem, das dies tut ("WINDOWS" vs. "CONSOLE"). Visual Studio verwendet diese Linkereinstellung, um zu steuern, welcher vom Benutzer bereitgestellte Eintrag den Startup-Code des CRT aufruft. – IInspectable
Zitieren Sie mich nicht auf diese, aber die Win32 console API könnte das sein, was Sie suchen. Wenn Sie dies nur für Debugging-Zwecke tun, sind Sie möglicherweise mehr daran interessiert, DebugView auszuführen und die DbgPrint-Funktion aufzurufen.
Dies setzt natürlich Ihre Anwendung voraus, dass Sie die Konsolenausgabe senden und nicht aus einer anderen Anwendung lesen möchten. In diesem Fall könnten Rohre dein Freund sein.
Laut dem Link zu 'DbgPrint' gilt: 'Nur Kernel-Modus-Treiber können die DbgPrint-Routine aufrufen.' Also wahrscheinlich nicht, was die meisten Leute wollen – Paladin
Huh. Nun, ich weiß, dass es eine Benutzermodus-Funktion zum Loggen von Nachrichten gibt, die in DebugView erscheinen. Ich dachte, dass DbgPrint es war, aber offensichtlich nicht. –
Die Benutzermodusfunktion zum Ablegen von Text, der in DebugView angezeigt wird, ist [OutputDebugString] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363362.aspx). – IInspectable
Auschecken Adding Console I/O to a Win32 GUI App. Dies kann Ihnen helfen, das zu tun, was Sie wollen.
Wenn Sie den Code nicht haben oder nicht ändern können, versuchen Sie die Vorschläge here, Konsolenausgabe in eine Datei umzuleiten.
Edit: bisschen Thread Nekromantie hier. Ich habe zuerst vor 9 Jahren in den frühen Tagen von SO geantwortet, bevor die (gute) Politik der Nicht-Link-Only-Antworten in Kraft trat. Ich werde den Code aus dem Originalartikel in der Hoffnung, für meine vergangenen Sünden zu sühnen, erneut veröffentlichen.
guicon.cpp - Eine Konsolenumleitungsfunktion
#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <fstream>
#ifndef _USE_OLD_IOSTREAMS
using namespace std;
#endif
// maximum mumber of lines the output console should have
static const WORD MAX_CONSOLE_LINES = 500;
#ifdef _DEBUG
void RedirectIOToConsole()
{
int hConHandle;
long lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp;
// allocate a console for this app
AllocConsole();
// set the screen buffer to be big enough to let us scroll text
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = MAX_CONSOLE_LINES;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
// redirect unbuffered STDOUT to the console
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);
// redirect unbuffered STDIN to the console
lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "r");
*stdin = *fp;
setvbuf(stdin, NULL, _IONBF, 0);
// redirect unbuffered STDERR to the console
lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stderr = *fp;
setvbuf(stderr, NULL, _IONBF, 0);
// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
// point to console as well
ios::sync_with_stdio();
}
#endif
//End of File
guicon.h - Schnittstelle Umleitung Funktion zu trösten
#ifndef __GUICON_H__
#define __GUICON_H__
#ifdef _DEBUG
void RedirectIOToConsole();
#endif
#endif
// End of File
test.cpp - Demonstrieren Konsolenumleitung
#include <windows.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdio.h>
#ifndef _USE_OLD_OSTREAMS
using namespace std;
#endif
#include "guicon.h"
#include <crtdbg.h>
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
#ifdef _DEBUG
RedirectIOToConsole();
#endif
int iVar;
// test stdio
fprintf(stdout, "Test output to stdout\n");
fprintf(stderr, "Test output to stderr\n");
fprintf(stdout, "Enter an integer to test stdin: ");
scanf("%d", &iVar);
printf("You entered %d\n", iVar);
//test iostreams
cout << "Test output to cout" << endl;
cerr << "Test output to cerr" << endl;
clog << "Test output to clog" << endl;
cout << "Enter an integer to test cin: ";
cin >> iVar;
cout << "You entered " << iVar << endl;
#ifndef _USE_OLD_IOSTREAMS
// test wide iostreams
wcout << L"Test output to wcout" << endl;
wcerr << L"Test output to wcerr" << endl;
wclog << L"Test output to wclog" << endl;
wcout << L"Enter an integer to test wcin: ";
wcin >> iVar;
wcout << L"You entered " << iVar << endl;
#endif
// test CrtDbg output
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
_RPT0(_CRT_WARN, "This is testing _CRT_WARN output\n");
_RPT0(_CRT_ERROR, "This is testing _CRT_ERROR output\n");
_ASSERT(0 && "testing _ASSERT");
_ASSERTE(0 && "testing _ASSERTE");
Sleep(2000);
return 0;
}
//End of File
http://www.gamedev.net/community/forums/topic.asp?topic_id=509479&whichpage=1 –
Guter Link. Die Foren von gamedev.net haben mir immer eine Fülle von Informationen zur Verfügung gestellt. – luke
Die Links können hilfreich sein, aber diese Antwort enthält keine weiteren Informationen als diese Links. Wenn diese unzugänglich werden, ist diese Antwort nicht mehr hilfreich. – IInspectable
Sie können auch die Cout- und Cerr-Streams erneut öffnen, um sie in eine Datei auszugeben. Folgendes sollte für diese Arbeit:
#include <iostream>
#include <fstream>
int main()
{
std::ofstream file;
file.open ("cout.txt");
std::streambuf* sbuf = std::cout.rdbuf();
std::cout.rdbuf(file.rdbuf());
//cout is now pointing to a file
return 0;
}
ein Rohr zu schaffen, führt die Programmkonsole Createprocess() und mit Readfile() oder schreibt in Konsole Writefile()
HANDLE hRead ; // ConsoleStdInput
HANDLE hWrite; // ConsoleStdOutput and ConsoleStdError
STARTUPINFO stiConsole;
SECURITY_ATTRIBUTES segConsole;
PROCESS_INFORMATION priConsole;
segConsole.nLength = sizeof(segConsole);
segConsole.lpSecurityDescriptor = NULL;
segConsole.bInheritHandle = TRUE;
if(CreatePipe(&hRead,&hWrite,&segConsole,0))
{
FillMemory(&stiConsole,sizeof(stiConsole),0);
stiConsole.cb = sizeof(stiConsole);
GetStartupInfo(&stiConsole);
stiConsole.hStdOutput = hWrite;
stiConsole.hStdError = hWrite;
stiConsole.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
stiConsole.wShowWindow = SW_HIDE; // execute hide
if(CreateProcess(NULL, "c:\\teste.exe",NULL,NULL,TRUE,NULL,
NULL,NULL,&stiConsole,&priConsole) == TRUE)
{
//readfile and/or writefile
}
}
gelesen Wechseln Sie zu Projekt> Projekteigenschaften> Linker> System, und setzen Sie im rechten Bereich SubSystems auf Konsole (/ SUBSYSTEM: CONSOLE)
Dann kompilieren Sie Ihr Programm und führen Sie es von der Konsole aus, um zu sehen, ob Ihre Eingabeaufforderung Ihre Ausgaben zeigt oder nicht.
Wenn Sie die Ausgabe Ihres Programms an eine Datei oder Pipe senden, z.
myprogram.exe > file.txt
myprogram.exe | anotherprogram.exe
oder Sie sich berufen Ihr Programm aus einem anderen Programm und dessen Ausgang über eine Leitung aufnehmen, dann brauchen Sie nichts zu ändern. Es wird einfach funktionieren, auch wenn der Einstiegspunkt WinMain
ist.
Wenn Sie Ihr Programm jedoch in einer Konsole oder in Visual Studio ausführen, wird die Ausgabe nicht in der Konsole oder im Ausgabefenster von Visual Studio angezeigt. Wenn Sie die Ausgabe "live" sehen möchten, versuchen Sie eine der anderen Antworten.
Im Grunde bedeutet dies, dass die Standardausgabe genau wie bei Konsolenanwendungen funktioniert, aber nicht mit einer Konsole verbunden ist, auf der Sie Ihre Anwendung ausführen, und es scheint keinen einfachen Weg zu geben (alle anderen) Die hier vorgestellten Lösungen verbinden die Ausgabe mit einem neuen Konsolenfenster, das beim Ausführen Ihrer Anwendung angezeigt wird, selbst von einer anderen Konsole aus.
Die Verwendung einer Kombination von luke's answer und Roger's answer here funktionierte für mich in meinem Windows Desktop Application-Projekt.
void RedirectIOToConsole() {
//Create a console for this application
AllocConsole();
// Get STDOUT handle
HANDLE ConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
int SystemOutput = _open_osfhandle(intptr_t(ConsoleOutput), _O_TEXT);
FILE *COutputHandle = _fdopen(SystemOutput, "w");
// Get STDERR handle
HANDLE ConsoleError = GetStdHandle(STD_ERROR_HANDLE);
int SystemError = _open_osfhandle(intptr_t(ConsoleError), _O_TEXT);
FILE *CErrorHandle = _fdopen(SystemError, "w");
// Get STDIN handle
HANDLE ConsoleInput = GetStdHandle(STD_INPUT_HANDLE);
int SystemInput = _open_osfhandle(intptr_t(ConsoleInput), _O_TEXT);
FILE *CInputHandle = _fdopen(SystemInput, "r");
//make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well
ios::sync_with_stdio(true);
// Redirect the CRT standard input, output, and error handles to the console
freopen_s(&CInputHandle, "CONIN$", "r", stdin);
freopen_s(&COutputHandle, "CONOUT$", "w", stdout);
freopen_s(&CErrorHandle, "CONOUT$", "w", stderr);
//Clear the error state for each of the C++ standard stream objects. We need to do this, as
//attempts to access the standard streams before they refer to a valid target will cause the
//iostream objects to enter an error state. In versions of Visual Studio after 2005, this seems
//to always occur during startup regardless of whether anything has been read from or written to
//the console or not.
std::wcout.clear();
std::cout.clear();
std::wcerr.clear();
std::cerr.clear();
std::wcin.clear();
std::cin.clear();
}
Ausgezeichnete Lösung. –
- 1. Wie bekomme ich Konsolenausgabe von einem Remote-Computer (SSH + Python)
- 2. Wie bekomme ich Konsolenausgabe in Visual Studio 2012 Komponententests
- 3. C++ - Konsolenausgabe in Netbeans
- 4. Problem mit C++ - Konsolenausgabe
- 5. Wie bekomme ich die swi-prolog Konsolenausgabe mit JPL?
- 6. Wie bekomme ich Multiline-Konsolenausgabe in MATLAB? horzcat Mit ist mir ein Fehler
- 7. Konsolenausgabe stoppt auf scanf() Methode in C++
- 8. Wie bekomme ich Elemente von einem Objekt in C#?
- 9. Wie bekomme ich die Rowid von einem ExecuteOracleNonQuery in C#
- 10. Wie bekomme ich mehrere Bilder aus einem Filestream in C#
- 11. C++ Code Ergebnisse in möglichen Konsolenausgabe Fehler
- 12. Wie bekomme ich Bitfinex-Ticker mit C#
- 13. Farbige Konsolenausgabe
- 14. Wie bekomme ich gängige Dateitypicons in C#?
- 15. Wie bekomme ich den Teilstring in C#?
- 16. Wie bekomme ich eine Echtzeituhr in C#?
- 17. Echtzeit-Konsolenausgabe Umleitung mit Prozess
- 18. Wie bekomme ich Videodatei Dauer in C#
- 19. Symfony Konsolenausgabe mit Escape-Zeichen
- 20. Wie bekomme ich Systemzeit in C++?
- 21. Wie bekomme ich% LocalAppData% in C#?
- 22. Wie bekomme ich einen Teilstring in C?
- 23. Wie bekomme ich eine Unterliste in C#
- 24. Wie bekomme ich HttpServletRequest in einem HttpSessionListener?
- 25. C#: Wie bekomme ich den Dokumenttitel von einem WebBrowser-Element?
- 26. Wie unterdrückt man die Konsolenausgabe in Python?
- 27. Konsolenausgabe in HTML-Datei
- 28. Wie bekomme ich JSON in .NET mit C# formatiert?
- 29. Wie bekomme ich TAPI in Vista mit C# arbeiten?
- 30. Wie bekomme ich einen Image-Dateityp mit GDI + in C++?
Versuchen Sie, Ihre Ausgabe oder eine andere Anwendung zu lesen? –