सी

2011-04-15 9 views
6

में एक विराम के साथ एक ही पंक्ति में प्रिंटिंग मैं अपने प्रोग्राम को कुछ प्रिंट करने के लिए बनाना चाहता हूं, फिर कुछ सेकंड प्रतीक्षा करें और फिर उसी पंक्ति में कुछ और प्रिंट करें। मैं के रूप में यह लिखने के लिए कोशिश की है:सी

printf ("bla bla bla"); 
sleep (2); 
printf ("yada yada yada\n"); 

लेकिन उत्पादन में मैं 2 सेकंड के लिए प्रतीक्षा करने के लिए और फिर मैं एक के रूप में मुद्रित पूरी लाइन मिलता है। जब मैंने आउटपुट को अलग-अलग लाइनों में डालने की कोशिश की तो उसने एक विराम के साथ प्रिंट किया।

मैं इसे उसी पंक्ति में एक विराम के साथ प्रिंट करने के लिए कैसे बना सकता हूं?

* लिनक्स

+4

fflush (stdout); – Erik

+0

आपके आधार पर 'fflush' की आवश्यकता केवल समस्या की शुरुआत हो सकती है। एक मामूली पूर्ण, कामकाजी उदाहरण के लिए SuperUser में स्थानांतरित होने के बाद से [मेरा उत्तर] (http://superuser.com/q/239893/1711) एक प्रश्न पर देखें। – dmckee

उत्तर

17
printf ("bla bla bla"); 
fflush(stdout); 
sleep (2); 
printf ("yada yada yada\n"); 

fflush stdout आंतरिक बफर बलों पर कार्य करने के लिए स्क्रीन प्लावित किया जाना है।

3

stdout डिफ़ॉल्ट रूप से एक लाइन buffered स्ट्रीम है, इसका मतलब है कि आपको इसे स्पष्ट रूप से फ़्लश करने की आवश्यकता है। यह पूरी तरह से नई लाइन पर flushed है। यह व्यवहार सी 99 मानक द्वारा अनिवार्य है।

इसका मतलब आपके पहले printf में है, पाठ को आंतरिक बफर में जोड़ा गया है। यह दक्षता में सुधार करने के लिए किया जाता है, उदाहरण के लिए जब छोटे टेक्स्ट टुकड़े प्रिंट करते हैं।

आपका दूसरा printf में एक नई लाइन है, और इससे स्ट्रीम को फ़्लश हो जाता है। यदि आप चाहें तो fflush(stdout); के माध्यम से आप stdout स्पष्ट रूप से फ्लश कर सकते हैं।

एक विकल्प के रूप में आप fprintf(stderr, "bla bla bla"); में unbuffered stderr का भी उपयोग कर सकते हैं, लेकिन जैसा कि इसके नाम से तात्पर्य है कि यह त्रुटियों और चेतावनियों के लिए है।

SO प्रश्न Why does printf not flush after the call unless a newline is in the format string? भी देखें।