2013-02-04 31 views
5

का उपयोग करते समय सी में डालता है() और printf() के बीच अंतर मैं नींद() फ़ंक्शन का उपयोग करते समय puts() और printf() फ़ंक्शंस के बीच अंतर सोच रहा था।नींद()

printf("hello, world"); 
sleep(1); 
printf("Good, bye!"); 

संकलन और कार्यक्रम चलाने के बाद, ऐसा लगता है कि यह पहली बार और फिर नींद प्रिंट होगा:

यहाँ मेरी कोड (सी भाषा में) है "हैलो, worldGood, अलविदा!"

हालांकि, अगर printf() के बजाय puts() का उपयोग करते हैं, तो यह "हैलो, दुनिया" प्रिंट करेगा, फिर अंत में "अच्छा, अलविदा" प्रिंट करेगा।

puts("hello, world"); 
sleep(1); 
puts("Good, bye!); 

उत्तर

7

यह बफरिंग के कारण है - डिफ़ॉल्ट रूप से, प्रत्येक नई लाइन तक मानक आउट बफर। printf() में एक नई लाइन शामिल नहीं है, इसलिए आउटपुट फ़्लश नहीं किया गया है। puts() में एक नई लाइन शामिल है, इसलिए आउटपुट फ़्लश हो गया है।

आप printf() कारण एक नई पंक्ति डालकर फ्लश करने के लिए कर सकते हैं:

printf("hello, world\n"); 

या fflush() सीधे फोन करके:

fflush(stdout); 

बफरिंग के बारे में अधिक जानकारी के लिए, setbuf() के लिए आदमी पृष्ठ देखें:

The three types of buffering available are unbuffered, block buffered, and 
    line buffered. When an output stream is unbuffered, information appears on 
    the destination file or terminal as soon as written; when it is block 
    buffered many characters are saved up and written as a block; when it 
    is line buffered characters are saved up until a newline is output or input 
    is read from any stream attached to a terminal device (typically stdin). 
    .... 
    If a stream refers to a terminal (as stdout normally does) it is 
    line buffered. 
    .... 
    The standard error stream stderr is always unbuffered by default. 
9

यह क्योंकि puts भी एक नई पंक्ति चरित्र जो, उपकरणों, जो सहभागी होने के लिए निर्धारित किया जा सकता है पर, डिफ़ॉल्ट रूप से निस्तब्धता का कारण बनता है (मानक आउटपुट के लिए) outputting है है (क)

आप अपने प्रारंभिक printf अंत में एक नई पंक्ति आउटपुट अगर ऐसा ही प्रभाव देखना चाहिए:

printf("hello, world\n"); 

या यदि आप fflush (stdout);sleep() कॉल करने से पहले। - (पारंपरिक इनपुट को पढ़ने के लिए) मानक इनपुट, मानक उत्पादन (

कार्यक्रम स्टार्टअप पर, तीन पाठ धाराओं पूर्वनिर्धारित हैं और स्पष्ट रूप से खोला होने की जरूरत नहीं:

C11 की प्रासंगिकता का 7.21.3 Files, खंड /7 है पारंपरिक आउटपुट लिखने के लिए), और मानक त्रुटि (डायग्नोस्टिक आउटपुट लिखने के लिए)। प्रारंभ में खोला गया, मानक त्रुटि स्ट्रीम पूरी तरह से buffered नहीं है; मानक इनपुट और मानक आउटपुट स्ट्रीम पूरी तरह से buffered हैं अगर केवल स्ट्रीम को निर्धारित किया जा सकता है कि को एक इंटरैक्टिव डिवाइस पर संदर्भित न करें।

यह C89/90 4.9.3 Files के दिनों को वापस harks:

कार्यक्रम स्टार्टअप पर, तीन पाठ धाराओं पूर्वनिर्धारित हैं और (पारंपरिक इनपुट को पढ़ने के लिए) स्पष्ट रूप से खोला नहीं जा जरूरत है --- मानक इनपुट, मानक आउटपुट (पारंपरिक आउटपुट लिखने के लिए), और मानक त्रुटि (नैदानिक ​​आउटपुट लिखने के लिए)। खोले जाने पर, मानक त्रुटि स्ट्रीम पूरी तरह से buffered नहीं है; मानक इनपुट और मानक आउटपुट स्ट्रीम पूरी तरह से बफर किए जाते हैं अगर केवल तभी स्ट्रीम किया जा सकता है जब एक इंटरैक्टिव डिवाइस को संदर्भित न किया जाए।


(क): यह नहीं है काफी कि सरल। शुरुआत के लिए, यह कार्यान्वयन केवल इसलिए निर्भर करता है क्योंकि मानक कहता है कि एक इंटरैक्टिव डिवाइस का गठन क्या कार्यान्वयन निर्भर है (व्यवहार निर्दिष्ट है लेकिन उस व्यवहार को प्रभावित करने वाली चीज़ नहीं है)।

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

+0

ठोस उत्तर। यदि आप उल्लेख करते हैं कि मानक C89 के बाद से इस तरह से किया गया है, तो मैं आपको +1 दूंगा जो आपको मेरे उत्तर से ऊपर रखेगा :) –

+1

मेरे लिए कुछ सस्ते प्रतिनिधि को पारित करना है। मैं बस हार्ड डिस्क पर चारों ओर झूठ बोलने के लिए होता है। अब मैं घर जा सकता हूं और पत्नी को बता सकता हूं कि "कभी भी कुछ फेंक न दें" रणनीति के फायदे हैं - वह इसके बारे में खुश नहीं है :-) – paxdiablo

0

जो मैं समझता हूं उससे, अगर कोई नई \n मौजूद है तो printf स्ट्रीम को फ्लश करेगा। डालता है, मुझे सच में यकीन नहीं है। यह कार्यान्वयन निर्भर हो सकता है।

आपकी नींद प्रिंटफ के लिए काफी लंबी है जिसमें स्ट्रीम को फ्लश करने के लिए \n नहीं है।

मुझे सलाह है कि fflush(stdout); के साथ आवश्यक होने पर स्ट्रीम को फ़्लश करें, फिर आप पूरी तरह नींद से बच सकते हैं।