विजुअल C ++ में कंसोल विंडो को कैसे खुला रखें?


191

मैं विज़ुअल सी ++ में शुरू कर रहा हूं और मैं जानना चाहता हूं कि कंसोल विंडो को कैसे रखा जाए।

उदाहरण के लिए यह एक विशिष्ट "हैलो वर्ल्ड" अनुप्रयोग होगा:

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

मुझे क्या लाइन याद आ रही है?


अमृत ​​ए। पिल्लई आपका कोड "जारी रखने के लिए कोई कुंजी दबाएं" नहीं दिखाता है धन्यवाद

आप एक साधारण std :: cout कॉल के साथ खुद को प्रिंट कर सकते हैं।
राऊल रोआ

5
सभी प्रस्तावित समाधानों के लिए नकारात्मक पक्ष यह है कि उनमें से कोई भी डिबगिंग के साथ काम नहीं करता है (Ctrl + F5 यहां विफल रहता है) और जब आवेदन अप्रत्याशित रूप से बंद हो जाता है (मुख्य ब्रेक पर सभी ब्रेकप्वाइंट या स्टड से पढ़ता है यहां असफल)। मैं जो देखना पसंद करूंगा वह एक इन-आईडीई कंसोल विंडो है जैसे एक्लिप्स और अन्य आईडीई। कार्यक्रम समाप्त होने के बाद वे केवल आउटपुट को stdout / stderr को दिखाते रहते हैं।
डॉ। Sybren

@sybren स्वीकृत उत्तर CTRL + F5 के साथ काम करता है, और आप ऐसा समाधान क्यों चाहते हैं जो डीबगिंग (F5) के साथ काम करता है? निश्चित रूप से डिबगिंग की पूरी बात .. डिबग है? डिबगिंग सत्र में, प्रोग्राम समाप्ति के बाद रुका हुआ कंसोल होने का क्या लाभ है?
8

2
@JBentley ग्रहण और अन्य आईडीई आपको प्रक्रिया समाप्त होने के बाद भी आपके कार्यक्रम के आउटपुट को पढ़ने की अनुमति देते हैं। निश्चित रूप से आप अतिरिक्त लाभ देखते हैं, खासकर जब बग खोजने की कोशिश कर रहे हैं? इसके अलावा एक ब्रेकपॉइंट केवल तभी काम करता है जब आपको पता हो कि प्रोग्राम कहां समाप्त हो रहा है, जो यह बताना मुश्किल हो सकता है कि आपकी स्क्रीन से आउटपुट कब गायब हो जाता है।
डॉ। 13

जवाबों:


389

Ctrl+F5केवल के बजाय के साथ परियोजना शुरू करो F5

कंसोल विंडो अब Press any key to continue . . .प्रोग्राम से बाहर निकलने के बाद संदेश के साथ खुली रहेगी ।

ध्यान दें कि इसके लिए Console (/SUBSYSTEM:CONSOLE)लिंकर विकल्प की आवश्यकता है , जिसे आप निम्न प्रकार से सक्षम कर सकते हैं:

  1. अपनी परियोजना खोलें, और समाधान एक्सप्लोरर पर जाएं। यदि आप K & R में मेरे साथ चल रहे हैं, तो आपका "समाधान" इसके अंतर्गत 1 प्रोजेक्ट के साथ 'हैलो' होगा, बोल्ड में भी 'हैलो'।
  2. 'हैलो' पर राइट क्लिक करें (या जो भी आपके प्रोजेक्ट का नाम है।)
  3. संदर्भ मेनू से "गुण" चुनें।
  4. कॉन्फ़िगरेशन गुण> लिंकर> सिस्टम चुनें।
  5. दाएं हाथ के फलक में "सबसिस्टम" संपत्ति के लिए, दाहिने हाथ के कॉलम में ड्रॉप-डाउन बॉक्स पर क्लिक करें।
  6. "कंसोल (/ SUBSYSTEM: CONSOLE)" चुनें
  7. लागू करें पर क्लिक करें, इसके लिए प्रतीक्षा करें कि वह जो भी करता है उसे पूरा करें, फिर ठीक पर क्लिक करें। (यदि "लागू करें" ग्रे हो गया है, तो कुछ अन्य सबसिस्टम विकल्प चुनें, लागू करें पर क्लिक करें, फिर वापस जाएं और कंसोल विकल्प को लागू करें। मेरा अनुभव है कि ओके बाय बाय काम नहीं करेगा।)

CTRL-F5 और सबसिस्टम संकेत एक साथ काम करते हैं; वे अलग विकल्प नहीं हैं।

(से DJMorreTX के सौजन्य http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 )


36
यह डिबगिंग के बिना कार्यक्रम चलाता है; यह बेहतर है कि एक समाधान है जो डिबग और साधारण रन मोड दोनों में काम करता है।
ァ パ ー フ ミ コ ''

3
किसी के लिए जो इस समाधान को एक परियोजना में काम करने के लिए नहीं मिल सकता है, यह Visual Studio में बग के कारण है। मैंने अभी फिक्स के साथ एक उत्तर पोस्ट किया है।
जेबेंटली

1
पुष्टि कर सकते हैं! एक सांत्वना ऐप था जो काम नहीं करता था और यह काम करता था। आपको अपना कोड cin.get(),getchar(), system("pause")किसी अन्य कचरा के साथ बदलने की आवश्यकता नहीं है । इस काम को बदलना।
16

Ctrl + F5 का अर्थ है 'बिना डिबगिंग के प्रारंभ करें'। इसलिए आप डिबगिंग के दौरान इसका उपयोग नहीं कर सकते। बस system("pause");अपने कोड के अंत में जोड़ें । यह समझ में आता है और ठीक काम करता है।
मिलाद

41

मानक तरीका cin.get()आपके रिटर्न स्टेटमेंट से पहले है।

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}

4
मुझे पता है कि चूंकि प्रोग्राम पहले से ही cout का उपयोग कर रहा है, इसलिए इसका पहले से ही ख्याल रखा गया है, लेकिन मुझे लगता है कि यह उल्लेख करना सार्थक है कि आपको #include <iostream> के साथ-साथ std नेमस्पेस का उपयोग करना होगा: std :: cinget () ।
ब्रायन

7
यह काम करता है लेकिन Ctrl + F5 वैश्विक वस्तु विनाश, आदि का पता लगाने के दौरान विशेष रूप से बेहतर है
टर्नरी

8
-1 के लिए _tmain। मैं cin.get()F5 के लिए एक ब्रेकपॉइंट रखने या Ctrl F5 का उपयोग करने के बजाय एक और -1 वोट करूंगा । लेकिन मैं केवल एक नीचता की अनुमति देता हूं।
चीयर्स एंड हीथ। - अल्फ

8
@ खीर: इसमें गलत क्या है _tmain? कंसोल सबसिस्टम को लक्षित करते हुए विंडोज एप्लिकेशन लिखने का यह मानक तरीका है। उस मानक से विचलन करना बुरा व्यवहार क्या होगा। स्पष्ट रूप से, कोई भी यहां पोर्टेबल कोड के बारे में बात नहीं कर रहा है; प्रश्न विजुअल C ++ कहता है और _tmainनमूना कोड में दिखाई देने वाला हस्ताक्षर है। इस धर्म को त्यागने का समय आ गया है। विंडोज डिफ़ॉल्ट रूप से "गैर-मानक" है, और इसके मानकों का पालन ​​करने के लिए बहुत अच्छे कारण हैं ।
कोड़ी ग्रे

8
@ कोडीग्रे: मेरा डाउनवोट _tmainइसलिए है क्योंकि यह पूरी तरह से गैर-मानक है (अंतर्राष्ट्रीय सी ++ मानक के लिए एक सादे की आवश्यकता है main), और क्योंकि यह माइक्रोसॉफ्ट की Tमैक्रो योजना का उपयोग करता है , जो विंडोज 9x का समर्थन करने के लिए अनावश्यक जटिलता और क्रिया है। यदि आपको लगता है कि मानक से भटकना बुरा व्यवहार है, तो आपको बिल्कुल उपयोग नहीं करना चाहिए tmaintmainकिसी की कुल अक्षमता प्रदर्शित करने के लिए, ट्रोलिंग के अलावा या पेशेवरों के लिए उपयोग करने के लिए कोई अच्छा कारण नहीं हैं ।
चीयर्स एंड हीथ। - अल्फ

24

returnलाइन पर ब्रेकपॉइंट लगाएं ।

आप इसे डिबगर में चला रहे हैं, है ना?


15
सबसे मुश्किल बार के रूप में कार्यक्रम के अंदर कई बाहर निकलें अंक हो सकता है
volzotan

लापता DLL के कारण कार्यक्रम शुरू नहीं हो सकता है, और उस ब्रेकपॉइंट पर कभी नहीं मारा जा सकता है
माइकल

18

एक अन्य विकल्प का उपयोग करना है

#include <process.h>
system("pause");

हालांकि यह बहुत पोर्टेबल नहीं है क्योंकि यह केवल विंडोज पर काम करेगा, लेकिन यह स्वचालित रूप से प्रिंट करेगा

जारी रखने के लिए कोई भी कुंजी दबाएँ...


1
सिस्टम ("विराम") आपके प्रोसेसर को चालू रखेगा, इसका उपयोग नहीं किया जाना चाहिए। एक Cin.get () या समकक्ष का उपयोग करें।
क्रथिक

systemमें घोषित किया गया है <stdlib.h>
मेलपोमिन

@ क्राइथिक मैंने इसे आज़माया और इसने 100% सीपीयू नहीं खाया। मेरे प्रोसेसर का उपयोग पूरे समय 0% - 1% पर था। पुनः उत्पन्न नहीं कर सकते।
मेलपोमिन

सिस्टम ("पॉज़") cmd में "पॉज़" कमांड को कॉल करेगा, जो हर समय सीपीयू का उपयोग नहीं करता है। यह अनिवार्य रूप से _getche () के बराबर है।
पॉल स्टेलियन

7

मेकफाइल प्रोजेक्ट्स के लिए, दृश्य स्टूडियो में बग के कारण स्वीकृत समाधान विफल हो जाता है (जो कि 2012 तक कम से कम मौजूद है - मैंने अभी तक 2013 का परीक्षण नहीं किया है)। यह बग यहां विस्तृत है

कंसोल प्रोजेक्ट को मेकफाइल प्रोजेक्ट पर प्रोग्राम समाप्ति के बाद करने के लिए, इन चरणों का पालन करें (यह 2010 - 2012 के अलावा संस्करणों के लिए भिन्न हो सकता है):

1) /SUBSYSTEM:CONSOLEलिंकर को पास करें। - संपादित करें : नीचे देखें।

2) एक पाठ संपादक में अपनी परियोजना फ़ाइल (.vcxproj) खोलें।

3) रूट <project>टैग के अंदर , निम्नलिखित डालें:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4) अपने समाधान में परियोजना को फिर से लोड करें।

5) डिबगिंग के बिना प्रोग्राम चलाएं (CTRL + F5)।

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

नीचे मेरी टिप्पणी के अनुसार, लिंकर विकल्प सेट करना /SUBSYSTEM:CONSOLEवास्तव में मेकफाइल प्रोजेक्ट्स के लिए अप्रासंगिक है (और जरूरी नहीं कि यदि आप MSVC के अलावा अन्य कंपाइलर का उपयोग कर रहे हैं)। यह सब मायने रखता है कि सेटिंग को .vcxproj फ़ाइल में जोड़ा गया है, जैसा कि चरण 3 से ऊपर है।


मैंने उस चरण 3 के बारे में पहले कभी नहीं सुना है। तुम्हें यकीन है कि आवश्यक है और काम करता है?
मिंग डक

@mooingduck हां, और यहां आपके उत्तर पर मेरी टिप्पणियों के बाद , मुझे अब पता चला है कि /SUBSYSTEM:CONSOLEलिंकर को पास करना वास्तव में अप्रासंगिक है - चरण 3 यह सब मायने रखता है। ध्यान रखें कि मेरा उत्तर मेकफाइल प्रोजेक्ट्स से संबंधित है - मेकफाइल प्रोजेक्ट में, IDE के पास यह जानने का कोई तरीका नहीं है कि आप लिंकर में क्या कर रहे हैं (आप एक कंपाइलर का उपयोग भी नहीं कर सकते हैं जिसके पास /SUBSYSTEM:CONSOLEविकल्प है), और यह प्रोजेक्ट है खुद जो ट्रैक करता है या नहीं, इसका मतलब कंसोल प्रोग्राम है। मैं तदनुसार अपना उत्तर संपादित करूंगा।
जेबंटले

1
@mooingduck मैं इस बात की भी पुष्टि कर सकता हूं कि मैं इस समाधान का उपयोग स्वयं को makefile प्रोजेक्ट में करता हूं, SCons के साथ बिल्ड सिस्टम के रूप में, और MSVC और MinGW को संकलक के रूप में। गैर-डीबगिंग मोड में समाप्ति के बाद कंसोल को रोकने के लिए आईडीई प्राप्त करने का कोई और तरीका नहीं है।
जेबेंटली

1
@chuckleplant मुझे डर नहीं है, मेरे वर्कफ़्लो के चारों ओर एक और तरीका था, वीसी से SCons कॉल करना। मैंने शुरू में अपने वीएस मेकफाइल प्रोजेक्ट्स को मैन्युअल रूप से बनाया था ताकि वे मेरी स्कैन्स लिपि (जैसे 32/64 बिट, संकलक नाम, रिलीज़ / डिबग) के लिए कॉन्फ़िगरेशन चर पारित कर दें, जो तब बाकी तर्क को संभाले। उस सेटअप में प्रोजेक्ट फ़ाइलों को कभी भी बदलने की आवश्यकता नहीं थी, इसलिए मैंने SCons के किसी भी ऑटो-जेनरेटिंग फीचर का उपयोग नहीं किया। मैंने तब से लिनक्स पर स्विच किया है, इसलिए मैं अब वीएस का उपयोग नहीं करता हूं। चूंकि यह वीएस बग है, इसलिए यह आवश्यक अतिरिक्त कदम को संभालने के लिए स्कोनस को एक सुविधा अनुरोध प्रस्तुत करने के लायक हो सकता है।
JBentley

1
वैकल्पिक रूप से, आप अपने स्कून स्क्रिप्ट में कुछ पायथन कोड को शामिल कर सकते हैं, यह एक प्रोजेक्ट फ़ाइल के उत्पन्न होने पर हर बार स्वयं करने के लिए। मेरा मानना ​​है कि वीएस परियोजना फाइलें एक्सएमएल मानक के अनुरूप हैं, इसलिए लापता तत्वों को जोड़ना काफी आसान होना चाहिए, और केवल कोड की कुछ पंक्तियों की आवश्यकता होनी चाहिए। मैं यहां (अजगर 2.x के लिए) या यहां (3.x) शुरू करने का सुझाव दूंगा । यह उत्तर रूचि का भी हो सकता है।
JBentley

4

कंसोल विंडो को बंद होने से बचाने के लिए आप अपने रिटर्न स्टेटमेंट से पहले cin.get();या cin.ignore();बस इस्तेमाल कर सकते हैं ।


4

बस मुख्य के अंतिम घुंघराले ब्रैकेट पर एक ब्रेकपॉइंट लगाएं।

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

यह मेरे लिए काम करता है, डिबगिंग के बिना चलने की आवश्यकता नहीं है। यह ब्रेकपॉइंट को मारने से पहले विनाशकों को भी निष्पादित करता है ताकि आप इन विध्वंसक पर कोई भी संदेश प्रिंट की जांच कर सकें यदि आपके पास कोई है।


3

बस अपनी _tmainविधि के समापन ब्रैकेट में एक ब्रेकपॉइंट जोड़ें । यह आसान तरीका है और साथ ही आपको डिबग करने के लिए कोड नहीं जोड़ना होगा।


2

के अंतिम ब्रेस पर एक ब्रेकपॉइंट रखें main()। यह कई returnबयानों के साथ भी उलझ जाएगा । केवल नकारात्मक पक्ष यह है कि कॉल को exit()पकड़ा नहीं जा सकता है।

यदि आप डिबगिंग नहीं कर रहे हैं, तो ज़ोएडबर्ग के जवाब में सलाह का पालन करें और अपने कार्यक्रम को केवल के बजाय Ctrl+ के साथ शुरू करें ।F5F5


2

मेरे 2 सेंट:

विकल्प 1: के अंत में एक ब्रेकप्वाइंट जोड़ें main()

विकल्प 2: इस कोड को इससे पहले जोड़ें return 0;:

std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

आप शामिल करने की ज़रूरत <iomanip>के लिएstd::numeric_limits


2

इस तरह से 0 लौटने से पहले कोड के अंत में सिर्फ सिस्टम ("पॉज़") जोड़ें

#include <stdlib.h>

int main()
{
    //some code goes here
    system("pause")
    return 0;
}



1

मैं शामिल करता हूं #include <conio.h>और फिर, लाइन getch();से ठीक पहले जोड़ता हूं return 0;। मैंने वैसे भी स्कूल में यही सीखा है। यहाँ ऊपर दिए गए तरीके काफी अलग हैं जो मैं देख रहा हूँ।


2
-1: इस तथ्य से अलग कि आमतौर पर कार्यक्रम को रोकना आमतौर पर गलत समाधान होता है (क्योंकि ज्यादातर मामलों में वह व्यवहार नहीं होता है जो आप चाहते हैं कि आपका जारी बाइनरी आपके पास हो), conio.h गैर-मानक , पुराना और एक है C शीर्ष लेख, C ++ नहीं! दुर्भाग्य से, स्कूलों में बहुत सारी खराब प्रोग्रामिंग प्रथाएं सिखाई जाती हैं।
जेबंटले

एक उम्मीद है कि यह केवल परीक्षण के दौरान उपयोग किया जाएगा, यह ऐसा कुछ नहीं है जिसे आप अंतिम संस्करण में रखेंगे। यदि आप विंडोज के लिए कोडिंग कर रहे हैं, तो #include <conio.h> / _getch () के साथ क्या समस्या है? इसे cin.get () से लिखने की जल्दी है, 2 कुंजी (कम से कम एक वर्ण + दर्ज) को दबाने की आवश्यकता नहीं है, और केवल डिबग या केवल रिलीज़ मोड में काम नहीं करता है। फिर गलत क्या है?
बर्नैक

1

एक ही समस्या थी। मैं _getch()रिटर्न स्टेटमेंट से ठीक पहले इस्तेमाल कर रहा हूं । यह काम करता हैं।


आप अपने कोड में उदाहरण और स्पष्टीकरण जोड़ना चाह सकते हैं, विशेष रूप से एक प्रश्न के उत्तर के लिए / बहुत पहले। इसके अलावा, आप उत्तर कार्यात्मक रूप से कई पुराने उत्तरों के समान हैं, और उसी कॉल का उपयोग किसी अन्य मौजूदा उत्तर के रूप में करते हैं।
क्लॉकवर्क-म्यूज़ियम

0

(कुछ विकल्पों को अलग-अलग नामों से बुलाया जा सकता है। मैं अंग्रेजी संस्करण का उपयोग नहीं करता हूं)

मेरे पास एक ही समस्या थी, जब मैंने "खाली परियोजना" विकल्प के साथ परियोजनाएं बनाईं, तो "खाली परियोजना" के बजाय "विन 32-कंसोल एप्लिकेशन" के रूप में परियोजना बनाएं। संवाद में जो अब पॉप अप होता है, आप "जारी रखें" दबाएं और उसके बाद आप "खाली प्रोजेक्ट" विकल्प की जांच कर सकते हैं और पुष्टि कर सकते हैं। उसके बाद CTRL + F5 एक कंसोल को खोलेगा जो अपने आप बंद नहीं होता है।


0

मुझे भी यही समस्या थी; मेरे आवेदन में कई एक्ज़िट () अंक हैं और यह जानने का कोई तरीका नहीं है कि वास्तव में यह कहाँ से निकलता है, तब मुझे इस बारे में पता चला:

atexit(system("pause"));

या

atexit(cin.get());

इस तरह से यह बिना किसी रोक-टोक के चलेगा कि हम प्रोग्राम में कहाँ से निकलते हैं।


उनमें से कोई भी वैध कॉल नहीं है atexitatexitफ़ंक्शन पॉइंटर लेता है, पूर्णांक नहीं।
मेलेपोमिन

0

एक अन्य विकल्प:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

मुख्य में:

int main(int argc, char* argv[]) {
    MAINRET;
}

0

दरअसल, असली समाधान प्रोजेक्ट टेम्पलेट का चयन ही है। आप पुराने VS में Win32 कंसोल एप्लिकेशन का चयन करें, या पहले प्रोजेक्ट नाम भरें और फिर Windows डेस्कटॉप विज़ार्ड पर डबल क्लिक करें और फिर Win32 कंसोल एप्लिकेशन का चयन करें। फिर इस बिंदु पर खाली प्रोजेक्ट का चयन करें। इसके बाद मूल प्रश्नकर्ता वास्तव में अतिरिक्त स्टॉपिंग पॉइंट और होल्ड कोड जोड़े बिना क्या चाहता है। मैं इस समस्या से भी गुज़रा। इसका जवाब MSDN साइट पर भी है।


0

यहां किसी भी कोड को संशोधित किए बिना निष्पादन कैसे बंद हो जाता है इसकी परवाह किए बिना कमांड विंडो को खुला रखने का एक तरीका है:

Visual Studio में, प्रोजेक्ट गुण पृष्ठ खोलें -> डीबगिंग

के लिए कमान , में प्रवेश$(ComSpec)

के लिए कमान तर्क , प्रवेश /k $(TargetPath)। अपने स्वयं के आवेदन के लिए किसी भी तर्क को संलग्न करें।

अब F5 या Ctrl-F5 एक नई विंडो में Windows / System32 / cmd.exe निष्पादित करता है , और / k यह सुनिश्चित करता है कि कमांड प्रॉम्प्ट निष्पादन पूर्ण होने के बाद खुला रहता है।

नकारात्मक पक्ष यह है कि निष्पादन ब्रेकपॉइंट पर बंद नहीं होगा।


0

जैसा कि कुछ पहले ही बता चुके हैं, Zoidbergs समाधान डिबगर को संलग्न नहीं करता है, जो कुछ ऐसा है जो आप आमतौर पर नहीं चाहते हैं।

उपकरण> विकल्प> डिबगिंग> सामान्य पर जाकर अपने वीएस को तदनुसार (वीएस 2017 के बाद से) कॉन्फ़िगर करने के लिए सबसे अच्छा विकल्प इमो है। वहाँ आप अनचेक करें "डिबगिंग बंद होने पर कंसोल को स्वचालित रूप से बंद करें" (बहुत नीचे), जो संभवतः आपके मामले में जांचा जाता है।


-1

आप बस Keep_window_open () डाल सकते हैं; यहां लौटने से पहले एक उदाहरण है

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}

2
Keep_window_open () कहां से आता है, उदा। कौन सी हेडर फ़ाइल और लाइब्रेरी?
टॉम

इसके इस एक से std_lib_facilities.h लेकिन आपके द्वारा इसमें शामिल अधिकांश समय
सिफिस बेबियोनिताकिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.