यदि मेरे पास मूल सी ++ विंडोज प्रोग्राम है (यानी प्रवेश बिंदु WinMain है) मैं std :: cout जैसे कंसोल फ़ंक्शंस से आउटपुट कैसे देखूं?मैं विंडोज प्रोग्राम के साथ सी ++ में कंसोल आउटपुट कैसे प्राप्त करूं?
उत्तर
चूंकि कोई कंसोल विंडो नहीं है, इसलिए
असंभव
मुश्किल है। (हर दिन कुछ नया सीखें - मुझे कंसोल फ़ंक्शंस के बारे में कभी नहीं पता था!)
क्या आपके आउटपुट कॉल को प्रतिस्थापित करना संभव है? विजुअल स्टूडियो आउटपुट विंडो में जानकारी भेजने के लिए मैं अक्सर TRACE या OutputDebugString का उपयोग करता हूं।
दरअसल, मुख्य() के बजाय WinMain() प्रविष्टि बिंदु का उपयोग कर प्रोग्राम के लिए कंसोल विंडो प्राप्त करना संभव है, लेकिन मुश्किल है। –
@ क्रिस क्रिसबार्क: [AllocConsole] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms681944.aspx) को कॉल करना वास्तव में मुश्किल नहीं है। यह [कंसोल के निर्माण] के तहत समझाया गया है (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682528.aspx)। इसके अलावा, उपयोगकर्ता द्वारा प्रदत्त प्रविष्टि बिंदु का नाम कंसोल के निर्माण को नियंत्रित नहीं करता है। यह सबसिस्टम के लिए पीई हेडर एंट्री है जो ('विन्डोज़ बनाम' कंसोल ') करता है। विजुअल स्टूडियो उस लिंकर सेटिंग को नियंत्रित करने के लिए उपयोग करता है, जो उपयोगकर्ता द्वारा प्रदत्त प्रविष्टि को सीआरटी के स्टार्टअप कोड कॉल में इंगित करता है। – IInspectable
मुझे इस पर उद्धरण न दें, लेकिन Win32 console API जो भी आप खोज रहे हैं हो सकता है। यदि आप इसे डिबगिंग उद्देश्यों के लिए कर रहे हैं, तो, आप DebugView चलाने और DbgPrint फ़ंक्शन को कॉल करने में अधिक रुचि ले सकते हैं।
यह निश्चित रूप से आपके एप्लिकेशन को मानता है कि आप कंसोल आउटपुट भेजना चाहते हैं, इसे किसी अन्य एप्लिकेशन से नहीं पढ़ना चाहते हैं। उस मामले में, पाइप आपका दोस्त हो सकता है।
'डीबीजीप्रिंट 'के लिंक के मुताबिक यह कहता है कि' केवल कर्नेल-मोड ड्राइवर डीबीजीप्रिंट रूटीन को कॉल कर सकते हैं। ' तो संभवतः अधिकतर लोग – Paladin
हू नहीं चाहते हैं। खैर, मुझे पता है कि लॉगिंग संदेशों के लिए उपयोगकर्ता-मोड फ़ंक्शन है जो डीबग व्यू में दिखाई देगा। मैंने सोचा कि डीबीजीप्रिंट यह था, लेकिन स्पष्ट रूप से नहीं। –
डीबग व्यू में दिखाए गए पाठ को डंप करने के लिए उपयोगकर्ता-मोड फ़ंक्शन [आउटपुटडिबगस्ट्रिंग] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363362.aspx) है। – IInspectable
Adding Console I/O to a Win32 GUI App देखें। यह आपको जो भी चाहिए वो करने में मदद कर सकता है।
आपके पास नहीं है, तो या कोड को संशोधित नहीं कर सकते, कोशिश सुझाव here पाया एक फाइल करने के लिए सांत्वना उत्पादन को अंतरित करें।
संपादित करें: धागा काला जादू यहाँ की बिट। मैं पहली बार, अतः के शुरुआती दिनों में इस 9ish साल पहले उत्तर दिया, इससे पहले कि केवल गैर-लिंक-जवाब का (अच्छा) नीति प्रभाव में आया। मैं अपने पिछले पापों के लिए प्रायश्चित करने की आशा में मूल लेख से कोड दोहरा दूंगा।
guicon.cpp - एक कंसोल पुनर्निर्देशन समारोह
#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 - इंटरफ़ेस पुनर्निर्देशन समारोह सांत्वना देने
#ifndef __GUICON_H__
#define __GUICON_H__
#ifdef _DEBUG
void RedirectIOToConsole();
#endif
#endif
// End of File
test.cpp - कंसोल पुनर्निर्देशन दिखाते
#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 –
अच्छा लिंक। Gamedev.net मंचों ने हमेशा मुझे जानकारी की एक संपत्ति प्रदान की है। – luke
लिंक सहायक हो सकते हैं, लेकिन इस उत्तर में उन लिंक की तुलना में कोई और जानकारी नहीं है। अगर वे पहुंच से बाहर हो जाते हैं, तो यह उत्तर अब सहायक नहीं होगा। – IInspectable
तुम भी रूप में अच्छी तरह एक फाइल करने के लिए उत्पादन के लिए अदालत और cerr धाराओं फिर से खोलना कर सकते हैं।))
#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;
}
एक पाइप बनाने, निष्पादित कार्यक्रम सांत्वना CreateProcess (और ReadFile के साथ पठित (या
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
}
}
सांत्वना WriteFile() में लिखते हैं: निम्नलिखित इस के लिए काम करना चाहिए परियोजना> प्रोजेक्ट गुण> लिंकर> सिस्टम में जाओ और दाएँ फलक में, उप विकल्प कंसोल के लिए (/ सबसिस्टम: कंसोल) सेट
फिर अपने कार्यक्रम संकलन और आप शीघ्र शो अपने आउटपुट नहीं आदेश या देखने के लिए कंसोल से इसे चलाने के।
यदि आप अपने प्रोग्राम का आउटपुट फाइल या पाइप पर भेज रहे हैं, उदा।
myprogram.exe > file.txt
myprogram.exe | anotherprogram.exe
या आप किसी अन्य प्रोग्राम से अपने कार्यक्रम लागू है और एक पाइप के माध्यम से इसके उत्पादन पर कब्जा कर रहे हैं, तो आप कुछ भी बदलने की जरूरत नहीं है। यह सिर्फ काम करेगा, भले ही प्रवेश बिंदु WinMain
है।
हालांकि, यदि आप अपने प्रोग्राम को कंसोल में या विजुअल स्टूडियो में चला रहे हैं, तो आउटपुट कंसोल में या विजुअल स्टूडियो की आउटपुट विंडो में दिखाई नहीं देगा। यदि आप आउटपुट "लाइव" देखना चाहते हैं, तो दूसरे उत्तरों में से एक आज़माएं।
असल में, इसका मतलब है कि मानक आउटपुट कंसोल अनुप्रयोगों के समान ही काम करता है, लेकिन यह उस कंसोल से कनेक्ट नहीं है जिसमें आप अपना आवेदन चला रहे हैं, और ऐसा करने का कोई आसान तरीका नहीं है (अन्य सभी प्रस्तुत किए गए समाधान आउटपुट को एक नई कंसोल विंडो से कनेक्ट करते हैं जो आपके एप्लिकेशन को चलाने पर पॉप अप करेगा, यहां तक कि किसी अन्य कंसोल से भी)।
luke's answer और Roger's answer here के संयोजन का उपयोग करके मेरे विंडोज डेस्कटॉप एप्लिकेशन प्रोजेक्ट में मेरे लिए काम किया।
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();
}
उत्कृष्ट समाधान। –
- 1. सी ++ कंसोल आउटपुट में सुपरस्क्रिप्ट
- 2. मैं जावा कंसोल आउटपुट को फ़ाइल में कैसे पाइप करूं?
- 3. मैं कंसोल प्रोग्राम के आउटपुट को थ्रेड सुरक्षित तरीके से टेक्स्ट बॉक्स में रीडायरेक्ट कैसे करूं?
- 4. मैं सी # कंसोल एप्लिकेशन का .exe नाम कैसे प्राप्त करूं?
- 5. सी #: बाहरी कंसोल प्रोग्राम को छिपाएं
- 6. विंडोज कंसोल प्रोग्राम stdout पाइप रीडायरेक्शन
- 7. अलग प्रोग्राम में टेक्स्टबॉक्स में कंसोल आउटपुट रीडायरेक्ट करें
- 8. विंडोज जीयूआई + कंसोल आउटपुट, लिनक्स-शैली
- 9. स्वरूपण सी ++ कंसोल आउटपुट
- 10. मैं विंडोज़ पर एसबीटी से रंग कोडित कंसोल आउटपुट कैसे प्राप्त करूं?
- 11. मैं एर्लांग के प्रीप्रोसेसर का आउटपुट कैसे प्राप्त करूं?
- 12. मैं कंसोल मोड में Emacs में मेनू कैसे प्राप्त करूं?
- 13. सी # एक साथ कंसोल इनपुट और आउटपुट?
- 14. मैं कंसोल पर आउटपुट के लिए कोरडाटा डीबग तर्क कैसे प्राप्त करूं?
- 15. विंडोज सिस्टम में सब्लिमे टेक्स्ट के साथ बाहरी कंसोल में प्रोग्राम कैसे चलाएं?
- 16. मैं जावास्क्रिप्ट में कंसोल इनपुट कैसे प्राप्त करूं?
- 17. मैं एक SQL बैकअप आदेश से परिणाम आउटपुट को डेल्फी प्रोग्राम में कैसे प्राप्त करूं?
- 18. पर्ल में बाहरी कमांड का आउटपुट कैसे प्राप्त करूं?
- 19. मैं सी # के साथ एक्सएमएल रूट नोड कैसे प्राप्त करूं?
- 20. विंडोज में सी ++ प्रोग्राम डीबग करने के लिए मैं मिनजीडब्ल्यू जीडीबी डीबगर का उपयोग कैसे करूं?
- 21. मैं सी # में% LocalAppData% कैसे प्राप्त करूं?
- 22. मैं सी # में सामान्य फ़ाइल प्रकार आइकन कैसे प्राप्त करूं?
- 23. मैं XUnit कंसोल के साथ NUnit स्वरूपित xml आउटपुट कैसे करूं?
- 24. सी #: पुनर्निर्देशन कंसोल अनुप्रयोग आउटपुट: आउटपुट कैसे फ्लश करें?
- 25. मैं कंसोल प्रोग्राम में माउस की स्थिति कैसे प्राप्त कर सकता हूं?
- 26. मैं विंडोज में एक सामान्य-लिस्प जीयूआई कैसे प्राप्त करूं?
- 27. मैं इस सी # प्रोग्राम में प्रिंट करने के लिए कॉलम नाम कैसे प्राप्त करूं?
- 28. मैं अपने होस्ट के आईपी पते को सी प्रोग्राम से कैसे आउटपुट करूं?
- 29. मैं विंडोज कंसोल में ठीक से प्रदर्शित करने के लिए मोचा के यूनिकोड आउटपुट कैसे प्राप्त कर सकता हूं?
- 30. मैं राइनो में कुछ कैसे आउटपुट करूं?
क्या आप अपना आउटपुट या अन्य एप्लिकेशन आउटपुट पढ़ने की कोशिश कर रहे हैं? –