के बाद लाइन बफर मोड में 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:
प्रिंट करता है (और मेरे इनपुट के लिए प्रतीक्षा करें)। अगर मैं स्कैनफ स्टेटमेंट को हटा देता हूं तो यह यहां नहीं है। ऐसा क्यों हैं?
धन्यवाद।
क्या आप समग्र आउटपुट दिखा सकते हैं। –
'fflush (stdout)' ठीक और पोर्टेबल है; यह है ['fflush (stdin)'] का उपयोग करना (http://stackoverflow.com/questions/2979209/using-fflushstdin) जो समस्याग्रस्त है। –
जब 'स्कैनफ() 'एक इंटरैक्टिव डिवाइस से पढ़ रहा है, तो मानक आउटपुट एक इंटरेक्टिव डिवाइस पर भी जा रहा है (' इंटरैक्टिव डिवाइस 'के लिए' टर्मिनल 'सोचने पर) यह अक्सर स्वचालित रूप से' fflush (stdout) 'चलाता है। यह मानक द्वारा न तो आवश्यक है और न ही प्रतिबंधित है - लेकिन सिंक्रनाइज़ेशन आम है और इसमें पर्याप्त ऐतिहासिक उदाहरण है। - मुझे विश्वास है कि इससे पहले पूछा गया है (और उत्तर दिया गया है)। अब डुप्लिकेट ढूंढने के लिए ...शायद उत्तेजना में एक अभ्यास। (साथ ही, आप 'स्कैनफ ("% c", और char_in) के साथ बेहतर तरीके से करेंगे, दो संकेतों पर - एक पॉइंटर पास करना, और पूर्व न्यूलाइन जैसी सफेद जगह छोड़ना)। –