2009-07-23 15 views
15

कंसोल प्रोग्राम संकलित करने के बाद कंसोल विंडो चलने के तुरंत बाद बंद हो जाती है। इसे खोलने के लिए सबसे अच्छा अभ्यास क्या है? मैंने Google लोड की खोज की है, मुझे कोडब्लॉक्स पर उपयोग किया जाता है, जहां आपको इसके बारे में चिंता करने की ज़रूरत नहीं है, लेकिन, मैं विजुअल स्टूडियो के साथ थोड़ा और वीएस के साथ गड़बड़ करना चाहता हूं, मेरा कंसोल बंद हो जाता है। इंटरवब्ज़ पर सभी इसे खोलने के कई अलग-अलग तरीके हैं, हालांकि, मैंने पढ़ा है कि उनमें से अधिकतर खराब कोडिंग तकनीकें हैं। हर किसी पसंदीदा विधि क्या है?कंसोल समापन समस्या का मुकाबला करने के लिए सबसे अच्छा अभ्यास क्या है?

उत्तर

5

cin निहायत असुरूप लेकिन आसान प्राप्त करने के लिए भुलक्कड़ के लिए है:

{ 
    char c; 
    std::cin >> c; 
} 

जब तक आप टाइप एक चरित्र/* * संपादित करें/और एंटर दबाएँ कि विंडो खुली रखती है।

std::cin.get() खिड़की को बंद कर देगा जब आप एक चरित्र टाइप करेंगे, जो कि आप कितनी आसानी से आदत बन जाते हैं, इस पर निर्भर करता है कि "अरेप्स, मेरी इच्छा है कि मैंने इसे बंद नहीं किया!" दो-कीस्ट्रोक operator>>(istream &) की तुलना में।

दोनों system("pause") से भिन्न होते हैं, जिसमें वे आपके द्वारा लिखे गए चरित्र के मूल्य-पहुंच योग्य तरीके से वापस आते हैं, इसलिए, यदि कभी-कभी ऐसा नहीं होता है, तो एक क्लज दूसरे की ओर जाता है, तो आप एक स्विच स्टेटमेंट लिख सकते हैं आपने तुरंत टाइप किया है (उदाहरण के लिए) तुरंत बाहर निकलें, लॉग पर कुछ मान लिखें, इसे फिर से चलाएं, आदि

+3

std :: cin.get() का एक ही प्रभाव होता है और छोटा –

+3

यह खिड़की रखता है जब तक कि यह एक चरित्र प्राप्त नहीं कर लेता है। जो बफर को फिसल नहीं जाता है (सीन बफर किया जाता है)। इसलिए उपयोगकर्ता को प्रवेश करने की आवश्यकता है (या बहुत सारे अक्षर टाइप करें और बफर भरें)। –

+0

@ robson3.1415, @martin संपादित करें :-) –

2

आपके मुख्य एप्लिकेशन कोड बंद होने के बाद कंसोल से एक कुंजी पढ़ने के लिए कोड में डालना बहुत आम है । केवल पढ़ने के लिए कीस्ट्रोक को फेंक दिया जाता है, लेकिन यह कंसोल खुला रहता है।

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

+0

मुझे डीबग # डिफाईन विचार पसंद है। ब्रेकपॉइंट से निश्चित रूप से बेहतर है। – AShelly

13

चूंकि आप हमेशा डीबगर में भागते हैं, main() से रिटर्न स्टेटमेंट पर ब्रेकपॉइंट सेट करें।

डीबगर आपका सबसे अच्छा दोस्त है, सीखें (और जल्दी सीखें) हर अवसर पर अपने लाभ के लिए इसका उपयोग करें।

+1

जब भी मैं ऐसा करता हूं, मैं लगातार खुद को crt0.c में कदम उठाने लगता हूं, जो वास्तव में कष्टप्रद है। – AShelly

6

वैकल्पिक रूप से एक छोटे बैच फ़ाइल एक कंसोल में अपने कार्यक्रम चलाएं, जो एक सांत्वना कार्यक्रम चलाने की उम्मीद तरीका होगा ...

, आप कर सकते हैं अपने कार्यक्रम पर अमल करने के लिए होता है कि:

REM batch file to launch program 
yourprogram.exe 
PAUSE 

और PAUSE cmd.exe आदेश उपयोगकर्ता से किसी भी कुंजी को दबाएगा।

+9

वास्तव में यह वास्तव में काफी आसान है। वीएस में अपनी परियोजना पर राइट क्लिक करें, गुण चुनें। डीबग सेक्शन के तहत आप इसे बाहरी प्रोग्राम शुरू करने के लिए कह सकते हैं। इस मामले में, यह बैच फ़ाइल होगी जो आपके एप्लिकेशन को लॉन्च करेगी। –

4

मैं जो आपको एक

Press any key to continue . . .

संदेश देता है system("PAUSE"); इस्तेमाल करते हैं।

+1

यह विंडोज़ विशिष्ट है जो मुझे लगता है, लेकिन यह काम पूरा हो जाता है। – DeusAduro

+0

आप सही हैं कि यह केवल विंडोज़ है, लेकिन मैंने इसे कभी भी विजुअल स्टूडियो में एक मुद्दा माना है, इसलिए यह ठीक होगा .. – irh

+2

-1 इस – Patrick

0

कॉल इस समारोह से पहले आप मुख्य के अंत में वापसी:

void onEnd() 
{ 
    printf("Press any key to exit..."); 
    _getch(); 
} 
21

जब मैं दृश्य स्टूडियो का उपयोग कर रहा है और मैं Ctrl +F5 कीस्ट्रोक का उपयोग कर डिबगिंग मैं सिर्फ इसे चलाने की जरूरत नहीं है – और यह कंसोल को बंद होने से रोकता है।

3

मैं का उपयोग करें:

cin.get() 

मैंने सुना है यह कम महंगा प्रणाली की तुलना में ("रोकें") था और यह POSIX सिस्टम पर भी काम करता है। एक शानदार link है जो इस बारे में विस्तार से बताता है।

+4

किसी भी चीज़ के साथ महंगा क्या करना है? कोड का पूरा बिंदु टर्मिनल विंडो को तब तक लटकाना है जब तक कि आप कोई कुंजी दबाए रखें। आपको लगता है कि 'सिस्टम ("PAUSE") 'की तुलना में कितनी धीमी है आपके प्रतिबिंब ;-) –

3

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

यदि आप डीबग करने के बजाए दौड़ते हैं तो विजुअल स्टूडियो एक कंसोल विंडो खुल जाएगा जो आपके एप्लिकेशन के बाहर निकलने के बाद रुक जाएगा ताकि आप अभी भी आउटपुट देख सकें। मुझे नहीं पता कि जब आप डीबग करते हैं तो व्यवहार अलग क्यों होता है, शायद इसलिए कि आपके पास ब्रेकपॉइंट्स उपलब्ध हैं, इसलिए यदि आप विभिन्न चरणों में आउटपुट देखना चाहते हैं तो आप प्रासंगिक आउटपुट स्टेटमेंट के बाद ब्रेकपॉइंट्स डाल सकते हैं, या main के अंत में या विभिन्न सक्षम कर सकते हैं 'अपवाद फेंकने पर रोकें' विकल्प।

जो भी कारण है, मैंने कभी भी अपने डिबगिंग अनुभव को बढ़ाने के लिए अपने आवेदन के व्यवहार से समझौता करने के लिए मजबूर नहीं किया है।

+0

रन बनाम डीबग के व्यवहार में अंतर के लिए +1। –

1

इस धागे में "ऐसा न करें" प्रतिक्रियाएं प्रतीत हो सकती हैं, लेकिन वे काफी समझदार हैं। मैं इस सवाल में हुआ क्योंकि मैं एक gtest suite को डिबग कर रहा हूं जो ठीक चलने के लिए उपयोग किया जाता था, लेकिन लॉन्च होने पर रहस्यमय तरीके से दुर्घटनाग्रस्त हो जाता है। कंसोल से चलाते समय, यह एक संवाद को पॉप करता है कि "blah.exe ने काम करना बंद कर दिया है"; लेकिन, जब डीबगर से चलाया जाता है, तो कंसोल क्षणिक रूप से पॉप अप हो जाता है, गायब हो जाता है, और प्रोग्राम 0 स्थिति से बाहर निकलता है।

मुझे इस बारे में सोचना चाहिए था कि व्यवहार में यह अंतर कितना अजीब था, लेकिन इसके बजाय मैं ऐसा था: "अरे, मैन --- मुझे उस कंसोल विंडो को बनाए रखना होगा ताकि मैं देख सकूं कि यह क्या कहता है।" सही?

यह पता चला है कि जिस मशीन पर मैं काम कर रहा हूं (मेरे एक सहयोगी) में '--gtest_filter = * testMsg *' पर डीबगर सेट के लिए 'कमांड तर्क' था। मैंने यह भी तुरंत देखा, लेकिन यह मेरे लिए कभी नहीं हुआ कि फिल्टर से मेल खाने वाले सभी परीक्षणों का नाम हाल ही में किया गया था। इसलिए, जब डीबगर से लॉन्च किया गया, तो gtest को चलाने के लिए कोई परीक्षण नहीं मिला था और बस बाहर निकल रहा था। मेरे जीवन का एक और 9 0 मिनट मैं कभी वापस नहीं आऊंगा। (-_-) अगर मैं अपने घुटने-झटके की प्रतिक्रिया को नहीं सोचता था तो मुझे इस टैर बच्चे को बहुत जल्द छीन सकता था, मुझे समस्या को हल करने के लिए उस कंसोल विंडो को खुले रहने की आवश्यकता थी ...

संबंधित मुद्दे