2010-09-16 7 views
16

धारा c99 की 7.9.13/7 कहा गया है कि:क्या स्टडआउट लाइन buffered, unbuffered या डिफ़ॉल्ट रूप से अनिश्चित है?

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

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

तो यह समझ में आता है। यदि आप अपने मानक आउटपुट को किसी फ़ाइल में दबा रहे हैं, तो आप इसे दक्षता के लिए पूरी तरह से बफर करना चाहते हैं।

लेकिन मैं करने के लिए के रूप में मानक में कोई जिक्र नहीं मिल सकता है उत्पादन लाइन बफ़र है या unbuffered जब आप निर्धारित नहीं कर सकता डिवाइस (एक टर्मिनल के लिए यानी, सामान्य उत्पादन) गैर-सहभागी है या नहीं।

कारण मैं पूछता हूँ कि मैं दो बयानों के बीच एक fflush(stdout); डालूँ मेरा उत्तर here के लिए एक टिप्पणी थी:

printf ("Enter number> "); 
// fflush (stdout); needed ? 
if (fgets (buff, sizeof(buff), stdin) == NULL) { ... } 

क्योंकि मैं एक नई पंक्ति के साथ printf समाप्त नहीं किया गया। क्या कोई इसे साफ़ कर सकता है?

उत्तर

26

सी 99 मानक निर्दिष्ट नहीं करता है कि तीन मानक धाराएं अनबफर या लाइन buffered हैं: यह कार्यान्वयन पर निर्भर है। सभी यूनिक्स कार्यान्वयन मुझे पता है कि stdin बफर किया गया है। लिनक्स पर, stdout लाइन buffered और stderr unbuffered में।

जहां तक ​​मुझे पता है, POSIX अतिरिक्त प्रतिबंध लागू नहीं करता है। POSIX के fflush पेज उदाहरण अनुभाग में टिप्पणी करता है:

[...] fflush() समारोह क्योंकि मानक आउटपुट आमतौर पर बफ़र है और शीघ्र तुरंत उत्पादन या टर्मिनल पर मुद्रित नहीं किया जा सकता प्रयोग किया जाता है।

तो टिप्पणी है कि आप fflush(stdout); जोड़ते हैं यह सही है।


एक वैकल्पिक stdout unbuffered बनाने के लिए हो सकता है:

setbuf(stdout, NULL); 
/* or */ 
setvbuf(stdout, NULL, _IONBF, 0); 

लेकिन जैसे आर नोट आप केवल एक बार ऐसा कर सकते हैं, और यह होना चाहिए इससे पहले कि आप stdout लिखें या किसी भी अन्य operantion प्रदर्शन यह। (C99 7.19.5.5 2)


मैं सिर्फ एक ही बात के बारे में comp.lang.c पर एक recent thread पढ़ें।टिप्पणी में से एक:

यूनिक्स परंपरा है कि stdin और stdout लाइन बफ़र जब एक टर्मिनल के साथ जुड़े रहे हैं, और पूरी तरह से बफ़र (उर्फ ब्लॉक बफ़र) अन्यथा है। stderr हमेशा unbuffered है।

+0

आप "अस्थायी रूप से" नहीं कर सकते हैं 'stdout' unbuffered। 'setbuf' और' setvbuf' ने अपरिभाषित व्यवहार किया है जब तक कि यह खोले जाने के बाद फ़ाइल पर पहला ऑपरेशन नहीं किया जाता है। –

+0

@ आर ..: धन्यवाद, आप सही हैं। मैंने इसे उत्तर में जोड़ा। – schot

+0

लाइन बफरिंग के मामले में, क्या एक उच्च वॉटरमार्क है जहां लाइन बहुत लंबी हो जाती है, तो इसे फ़्लश किया जाएगा? – CMCDragonkai

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