2016-09-15 7 views
8

के बाद लाइन बफर मोड में stdout के बिना न्यूलाइन के बिना प्रिंटिंग स्ट्रिंग स्ट्रिंग स्ट्रिंग्स (मुझे पता है कि अधिकांश टर्मिनल डिफ़ॉल्ट रूप से लाइन बफर मोड में हैं। यानी आउटपुट buffered है और एक नए लाइन चरित्र का सामना करने तक stdout करने के लिए निर्देशित नहीं है।printf() स्कैनफ()

तो मैं इस में कुछ भी नहीं मुद्रित करने के लिए उम्मीद करेंगे (कम से कम पहले बफर भरा है):

int main() { 
    while(1) { 
     printf("Haha"); 
     sleep(1); 
    } 
    return 0; 
} 

यह वास्तव में समय की एक छोटी अवधि के लिए कुछ भी नहीं प्रिंट करता है।

यदि मैं हर सेकेंड में "हाहा" प्रिंट करना चाहता हूं, तो मैं printf("Haha\n") या प्रिंटफ के बाद fflush(stdout) कर सकता हूं। (मैं जानता हूँ कि यह इतना पोर्टेबल नहीं है, लेकिन यह फिर भी एक समाधान है)

अब मैं (जबकि कार्यक्रम बाहर निकलने पर निस्तब्धता बफर को रोकने के लिए (1) पाश करने के लिए मेरे अलावा के साथ) बहुत क्लासिक scanf कार्यक्रम को याद:

int main() { 
    char char_in; 
    while(1) { 
     printf("Haha. Input sth here: "); 
     scanf("%c", &char_in); 
    } 
    return 0; 
} 

अब प्रोग्राम Haha. Input sth here: प्रिंट करता है (और मेरे इनपुट के लिए प्रतीक्षा करें)। अगर मैं स्कैनफ स्टेटमेंट को हटा देता हूं तो यह यहां नहीं है। ऐसा क्यों हैं?

धन्यवाद।

+1

क्या आप समग्र आउटपुट दिखा सकते हैं। –

+2

'fflush (stdout)' ठीक और पोर्टेबल है; यह है ['fflush (stdin)'] का उपयोग करना (http://stackoverflow.com/questions/2979209/using-fflushstdin) जो समस्याग्रस्त है। –

+4

जब 'स्कैनफ() 'एक इंटरैक्टिव डिवाइस से पढ़ रहा है, तो मानक आउटपुट एक इंटरेक्टिव डिवाइस पर भी जा रहा है (' इंटरैक्टिव डिवाइस 'के लिए' टर्मिनल 'सोचने पर) यह अक्सर स्वचालित रूप से' fflush (stdout) 'चलाता है। यह मानक द्वारा न तो आवश्यक है और न ही प्रतिबंधित है - लेकिन सिंक्रनाइज़ेशन आम है और इसमें पर्याप्त ऐतिहासिक उदाहरण है। - मुझे विश्वास है कि इससे पहले पूछा गया है (और उत्तर दिया गया है)। अब डुप्लिकेट ढूंढने के लिए ...शायद उत्तेजना में एक अभ्यास। (साथ ही, आप 'स्कैनफ ("% c", और char_in) के साथ बेहतर तरीके से करेंगे, दो संकेतों पर - एक पॉइंटर पास करना, और पूर्व न्यूलाइन जैसी सफेद जगह छोड़ना)। –

उत्तर

3

अब प्रोग्राम Haha. Input sth here: प्रिंट करता है (और मेरे इनपुट की प्रतीक्षा करें)। अगर मैं स्कैनफ स्टेटमेंट को हटा देता हूं तो यह यहां नहीं है। ऐसा क्यों हैं?

मानक (N1570 .. "लगभग C11") इसलिए कहते हैं क्योंकि, §5.1.2.3/6 (जोर मेरा):

एक अनुरूप क्रियान्वयन पर कम से कम आवश्यकताएँ हैं:

[..]

  • इंटरैक्टिव उपकरणों की इनपुट और आउटपुट गतिशीलता 7.21.3 में निर्दिष्ट के रूप में होगी। इन आवश्यकताओं का इरादा यह है कि पर जितनी जल्दी हो सके unbuffered या line-buffered आउटपुट दिखाई देता है यह सुनिश्चित करता है कि संदेश इनपुट के लिए प्रतीक्षा करने वाले प्रोग्राम से पहले संदेश प्रकट हो जाएं।

[..]

भले ही आपके उत्पादन एक नई पंक्ति शामिल नहीं है और एक लाइन stdout बफ़र लिए भेज है, यह अपने कार्यक्रम इनपुट के लिए प्रतीक्षा करने के लिए अनुमति दी है इससे पहले कि प्रकट करने के लिए है। ऐसा इसलिए है क्योंकि stdout और stdin टर्मिनल से जुड़े हुए हैं और इस प्रकार हैं (ध्यान दें: यह कार्यान्वयन परिभाषित है!) मानक "इंटरैक्टिव डिवाइस" मानक कहता है।

+0

ओएमजी। आप वास्तव में मानक दस्तावेजों में देखते हैं! आपके प्रयास के लिए धन्यवाद। मेरे जैसे नए लोग नहीं जानते कि अन्यथा कहां देखना है। –

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