दिलचस्प पोस्ट
एंड्रॉइड त्रुटि इसे पुन: उपयोग करने के लिए कैश में डाटालेट को कैसे स्टोर करना है? छोड़ने के बाद आवेदन नहीं छोड़ना जावास्क्रिप्ट / HTML5 में एक्सेल फाइल को कैसे पार्स करना है सामग्री संपादन योग्य डिवा में कर्सर पर टेक्स्ट डालें कैनवास के संदर्भ को प्राप्त करने के jQuery के बराबर कैसे PHP में एक फ़ाइल के लिए STDOUT अनुप्रेषित करने के लिए? कैसे प्रोग्रामैंक खाली ब्राउजर कैश करने के लिए? जावास्क्रिप्ट: क्या हैं। विस्तार और। प्रोटोकाट के लिए प्रयोग किया जाता है? क्या धागा सुरक्षा के लिए @ सिंक्रनाइज़ की गारंटी देता है या नहीं? एचटीएमएल – उप फ़ोल्डर से रूट फ़ोल्डर की छवियों को चुनें मैं हर बार रैंड के साथ एक ही परिणाम क्यों प्राप्त करता हूं? पेपरक्लिप अपवाद: पेपरक्लिप :: एडाप्टरराइजिस्ट्री :: नोहैंडलर एरर Jquery का उपयोग करके छवियों पर दायाँ क्लिक करने से अक्षम करना विभाजन संख्या का उपयोग किए बिना संस्करण संख्याओं की तुलना करें

खिड़कियों में एक कंसोल में cout को पुनर्निर्देशित करना

मेरे पास एक आवेदन है जो अपेक्षाकृत पुराना है कुछ नाबालिग परिवर्तनों के माध्यम से, यह दृश्य सी ++ 2008 के साथ लगभग पूरी तरह से बनाता है। एक बात जिसे मैंने देखा है वह है कि मेरा "डिबग कंसोल" सही काम नहीं कर रहा है मूल रूप से अतीत में, मैंने अपने डीबग आउटपुट पर जाने के लिए कंसोल बनाने के लिए AllocConsole() का उपयोग किया है। तो मैं इसे करने के लिए stdout अनुप्रेषित करने के लिए freopen का उपयोग करेंगे। यह सी और सी ++ शैली IO दोनों के साथ पूरी तरह से काम करता है

अब, ऐसा लगता है कि यह केवल सी स्टाइल आईओ के साथ काम करेगा AllocConsole() साथ आवंटित सांत्वना के लिए AllocConsole() जैसे चीजों को पुनर्निर्देशित करने का सही तरीका क्या है?

यहाँ कोड है जो काम करने के लिए प्रयोग किया जाता है:

 if(AllocConsole()) { freopen("CONOUT$", "wt", stdout); SetConsoleTitle("Debug Console"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); } 

संपादित करें : मेरे लिए जो कुछ हुआ है वह है कि मैं कस्टम प्रवाहित कर सकता हूं जिसका ओवरफ्लो विधि सी शैली IO का उपयोग करते हुए लिखता है और इसके साथ std::cout के डिफ़ॉल्ट स्ट्रीम बफर को std::cout लेकिन यह एक पुलिस-आउट की तरह लगता है। क्या 2008 में ऐसा करने का एक उचित तरीका है? या यह शायद कुछ है जो एमएस अनदेखी है?

EDIT2 : ठीक है, इसलिए मैंने ऊपर बताए गए विचार के कार्यान्वयन को बनाया है। असल में यह इस तरह दिखता है:

 class outbuf : public std::streambuf { public: outbuf() { setp(0, 0); } virtual int_type overflow(int_type c = traits_type::eof()) { return fputc(c, stdout) == EOF ? traits_type::eof() : c; } }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // create the console if(AllocConsole()) { freopen("CONOUT$", "w", stdout); SetConsoleTitle("Debug Console"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); } // set std::cout to use my custom streambuf outbuf ob; std::streambuf *sb = std::cout.rdbuf(&ob); // do some work here // make sure to restore the original so we don't get a crash on close! std::cout.rdbuf(sb); return 0; } 

किसी के पास सिर्फ एक बेहतर / क्लीनर समाधान है जो कि सिर्फ fputc ?

Solutions Collecting From Web of "खिड़कियों में एक कंसोल में cout को पुनर्निर्देशित करना"

2 संपादित करें:

-D _CRT_SECURE_NO_WARNINGS ध्वज के साथ चेतावनियों को अक्षम करने के बजाय freopen_s का उपयोग करना:

 void BindStdHandlesToConsole() { // 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"); // 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(); } 

संपादित करें:

मैंने जो मूल विधि पोस्ट की थी वह वीएस2015 में काम नहीं करती है, यहां निश्चित नियमानुसार है:

 void BindStdHandlesToConsole() { // Redirect the CRT standard input, output, and error handles to the console freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("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(); } 

बेहतर है ना? क्या आपने कभी ऐसा काम किया है जहां आप पहले से लिखे गए कोड पर नज़दीकी नजर रखते हैं, और जैसा कि आप समझते हैं कि यह क्या कर रहा है, एक थोड़ा भयावह अभिव्यक्ति आपके चेहरे पर आती है और आपको लगता है कि "मैं क्या सोच रहा था"? हाँ, मुझे बस उन क्षणों में से एक था।

मैं इस रीडायरेक्शन कोड पर आधारित कुछ 10 साल पहले जैसे कुछ सचमुच आया था, और तब से मैं इसे चारों ओर ले गया हूं। यह काम किया, इसलिए मैंने इसका इस्तेमाल किया, लेकिन अब तक मैं लंबे समय में इसके बारे में बहुत बारीकी से नहीं देखा है। वीएस2015 में पुरानी विधि क्यों काम नहीं करती है, क्योंकि यह एक फाइल ऑब्जेक्ट की सामग्री को दूसरे में निर्दिष्ट करने का प्रयास कर रहा है। हाँ, यह कभी एक अच्छा विचार नहीं था। वास्तव में, यह वास्तव में बहुत बुरा विचार है कोड वीएस2015 में टूट जाता है क्योंकि माइक्रोसॉफ्ट ने एकीकृत सीआरटी कार्य के साथ, वे मूल रूप से सभी वास्तविक आंकड़ों को एक आंतरिक प्रकार में स्थानांतरित कर चुके हैं, और सभी सामग्री को सार्वजनिक फ़ाइल प्रकार से बाहर निकाला है, जो काफी उचित है, क्योंकि यह कभी भी प्रहार करने के लिए कानूनी नहीं था पहली जगह में यह संरचना

मूल कोड वास्तव में नए कंसोल के लिए एक हैंडल को खोलने की कोशिश कर रहा था, इसे सी फ़ाइल डिस्क्रिप्टर के साथ जोड़ता था, और सी मानक इनपुट / आउटपुट हैंडल के लिए FILE संरचनाओं में फाइल डिस्क्रिप्टर संख्या को अद्यतन करता था। वैसे ही ऐसा होता है, फ़्रीफ़ेंन ऐसा फ़ंक्शन होता है जो एक फ़ंक्शन कॉल में, बिल्कुल स्पष्ट रूप से और सुरक्षित तरीके से कर सकता है। जैसा बेन विजिट ने बताया, यह ऐसा करने का सही तरीका है।

जो सभी ने कहा, यहाँ व्यवहार का एक परिवर्तन है। अगर आपकी प्रक्रिया को पुनः निर्देशित इनपुट / आउटपुट के साथ शुरू किया गया था, IE, किसी ने आपकी प्रक्रिया के लिए इनपुट / आउटपुट को रीडायरेक्ट करने के लिए एक CreateProcess कॉल में STARTUPINFO संरचना का इस्तेमाल किया है, तो मैंने जो मूल कोड पोस्ट किया है वह कंसोल हैंडल का उपयोग करने के बजाय इसका सम्मान करेगा। नए कोड के साथ, STARTUPINFO के माध्यम से इनपुट / आउटपुट रीडायरेक्शन को नजरअंदाज किया जाएगा। मैं यह तय करने के लिए आपको छोड़ दूँगा कि क्या यह अच्छा है या बुरा है दुर्भाग्य से मुझे यहां कई विकल्प नहीं दिखाई देते हैं, क्योंकि मैं किसी अन्य तरीके को माइक्रोसॉफ्ट सीआरटी में नहीं देख सकता क्योंकि फ़ॉर्पेन फ़ंक्शन के अलावा किसी मौजूदा फाइल संरचना को बदलने के लिए, या फाइल को आंतरिक प्रकार में ढकने और आंतरिक रूप से ढंका सीधे में मूल्य (जो, मैं तुम्हें भीख माँगता हूँ, कृपया नहीं)।

मूल पोस्ट:

दृश्य स्टूडियो 2005 से 2013 में माइग्रेट करते समय मुझे अपने स्वयं के इनपुट रीडायरेक्शन कोड के साथ इस समस्या थी। समस्या badbit त्रुटि राज्य को सेट करने के लिए सी ++ स्ट्रीमों के कारण badbit , जिसके बाद कोई भी पढ़ा या लिखने में सफल नहीं होता आप स्ट्रीम ऑब्जेक्ट्स पर clear विधि को कॉल करके इसे आसानी से रीसेट कर सकते हैं। मैट पीटर्ससन द्वारा दिए गए उत्तर से संबंधित प्रश्न के जवाब में मुझे इस समस्या का उत्तर मिला: एक स्टड :: एंडलाइन करना इससे पहले कि AllocConsole std :: cout का कोई प्रदर्शन नहीं करता है

यहां लाइब्रेरी व्यवहार में एक बदलाव आया होगा, जहां दृश्य स्टूडियो 2005 में सी ++ स्ट्रीम उन्हें पुनर्निर्देशित करने के बाद काम करेंगे, जब तक उन तक पहुंचने के लिए अभी तक कोई प्रयास नहीं किया गया था। 2008 और बाद में, रनटाइम के लिए आरंभीकरण कोड किसी भी तरह से मानक इनपुट / आउटपुट संभाल लक्ष्य को मान्य करता है, और शुरू से ही सही ढंग से सेट करता है। वास्तविकता में, हमें मानक इनपुट / आउटपुट को पुनः निर्देशित करने के बाद हमेशा त्रुटि स्थिति को साफ करना चाहिए था, चूंकि यह पहले से अमान्य था अगर यह अपेक्षा करता है कि स्ट्रीम एक त्रुटि स्थिति में हो सकती है, तो यह बिल्कुल उचित लगता है।

यहां पर काम कर रहे दिनचर्या मैं अपने कोड में उपयोग किया है। यह विजुअल स्टूडियो 2013 में काम करता है:

 void BindStdHandlesToConsole() { //Redirect unbuffered STDIN to the console HANDLE stdInHandle = GetStdHandle(STD_INPUT_HANDLE); if(stdInHandle != INVALID_HANDLE_VALUE) { int fileDescriptor = _open_osfhandle((intptr_t)stdInHandle, _O_TEXT); if(fileDescriptor != -1) { FILE* file = _fdopen(fileDescriptor, "r"); if(file != NULL) { *stdin = *file; setvbuf(stdin, NULL, _IONBF, 0); } } } //Redirect unbuffered STDOUT to the console HANDLE stdOutHandle = GetStdHandle(STD_OUTPUT_HANDLE); if(stdOutHandle != INVALID_HANDLE_VALUE) { int fileDescriptor = _open_osfhandle((intptr_t)stdOutHandle, _O_TEXT); if(fileDescriptor != -1) { FILE* file = _fdopen(fileDescriptor, "w"); if(file != NULL) { *stdout = *file; setvbuf(stdout, NULL, _IONBF, 0); } } } //Redirect unbuffered STDERR to the console HANDLE stdErrHandle = GetStdHandle(STD_ERROR_HANDLE); if(stdErrHandle != INVALID_HANDLE_VALUE) { int fileDescriptor = _open_osfhandle((intptr_t)stdErrHandle, _O_TEXT); if(fileDescriptor != -1) { FILE* file = _fdopen(fileDescriptor, "w"); if(file != NULL) { *stderr = *file; setvbuf(stderr, NULL, _IONBF, 0); } } } //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(); } 

ios::sync_with_stdio() फ़ंक्शन के बारे में छोटे नोट, इसकी चिंता मत करो। इस समारोह को true साथ बुलाते हुए किसी राज्य को स्थापित करने के अलावा अन्य कुछ भी नहीं करता है जो कि पहले से ही किसी भी सक्षम करने के लिए डिफ़ॉल्ट हो। कुछ और उस फ़ंक्शन को कॉल को ट्रिगर करना होता है एक शुद्ध आकस्मिक साइड इफेक्ट होता है

मैं उत्तर के रूप में एक पोर्टेबल समाधान पोस्ट कर रहा हूं इसलिए इसे स्वीकार किया जा सकता है। मूल रूप से मैंने cout के streambuf को एक के साथ बदल दिया है जो सी फ़ाइल I / O का उपयोग कर कार्यान्वित किया जाता है जो रीडायरेक्ट हो रहा है। आपके इनपुट के लिए हर किसी के लिए धन्यवाद

 class outbuf : public std::streambuf { public: outbuf() { setp(0, 0); } virtual int_type overflow(int_type c = traits_type::eof()) { return fputc(c, stdout) == EOF ? traits_type::eof() : c; } }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // create the console if(AllocConsole()) { freopen("CONOUT$", "w", stdout); SetConsoleTitle("Debug Console"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); } // set std::cout to use my custom streambuf outbuf ob; std::streambuf *sb = std::cout.rdbuf(&ob); // do some work here // make sure to restore the original so we don't get a crash on close! std::cout.rdbuf(sb); return 0; } 

अगर कंसोल केवल डिबग के लिए है, तो आप केवल OutputDebugStringA / OutputDebugStringW डीबग OutputDebugStringW फ़ंक्शन का उपयोग कर सकते हैं। यदि आप डीबग मोड में हैं, तो उनके आउटपुट को वी.एस. में आउटपुट विंडो में निर्देशित किया जाता है, अन्यथा आप इसे देखने के लिए डीबग View का उपयोग कर सकते हैं।

आईओएस पुस्तकालय में एक ऐसा फ़ंक्शन होता है जो आपको सी ++ आईओ को जो भी मानक सी आईओ का प्रयोग कर रहा है, उसका पुन: सिंक्रनाइज़ करता है: IOS :: sync_with_stdio ()।

यहां एक अच्छी व्याख्या है: http://dslweb.nwnexus.com/~ast/dload/guicon.htm

मैं जो बता सकता हूं, आपके कोड को वीसी 2005 के साथ काम करना चाहिए, अगर कंसोल से यह आपकी पहली गतिविधि है।

कुछ संभावनाओं की जांच करने के बाद, आप कंसोल को आवंटित करने से पहले कुछ लिख सकते हैं। उस बिंदु पर std :: cout या std :: wcout पर लिखना असफल हो जायेगा और आपको आगे के आउटपुट को बनाने से पहले त्रुटि झंडे को साफ करना होगा।

यह लिंक कुछ जानकारी प्रदान कर सकता है: कंसोल I / O को Win32 GUI App में जोड़ने

रेमंड मार्टिनेऊ इस बारे में एक अच्छी बात कहती है कि 'पहली चीज है जो आप करते हैं'

मेरे पास एक रीडायरेक्शन समस्या है, जिसे मैं अब के विवरणों को भूल गया हूं, जहां यह पता चला कि ऐप के निष्पादन में बहुत जल्दी, रनटाइम आउटपुट निर्देशों के बारे में कुछ निर्णय लेता है, जो शेष एप्लिकेशन के लिए अंतिम है।

सीआरटी स्रोत के माध्यम से इस का पालन करने के बाद, मैं सीआरटी के भीतर एक चर को साफ़ करके इस तंत्र को तोड़ने में सक्षम था, जिसने मेरे ऑलोकसंसोल को पूरा करने के बाद इसे चीजों पर एक और नजर डाल दिया।

जाहिर है इस प्रकार की सामग्री को पोर्टेबल नहीं होने दिया जा सकता है, शायद टूलकेन संस्करणों में भी, लेकिन यह आपकी सहायता कर सकता है

अपने ऑलोकसंसोल के बाद, अगली कॉउट आउटपुट में सभी तरह से नीचे जाएं और पता करें कि यह कैसा चल रहा है और क्यों।

मूल के लिए आप बस sync_with_stdio (1) उदाहरण का उपयोग कर सकते हैं:

 if(AllocConsole()) { freopen("CONOUT$", "wt", stdout); freopen("CONIN$", "rt", stdin); SetConsoleTitle(L"Debug Console"); std::ios::sync_with_stdio(1); } 

मुझे यकीन नहीं है कि मैं इस समस्या को पूरी तरह से समझता हूं, लेकिन अगर आप निदान के उद्देश्य से डेटा को शांत करने में सक्षम होना चाहते हैं तो आप सिस्टम :: डायग्नॉस्टिक्स :: प्रक्रिया :: निष्पादन () विधि या कुछ तरीकों से क्यों नहीं आज़माते कि नाम स्थान ??

अग्रिम में क्षमा चाहते हैं यदि यह अप्रासंगिक था