नहीं, यह POSIX व्यवहार नहीं है, यह के आईएसओ व्यवहार (ठीक है, यह है POSIX व्यवहार लेकिन केवल insofar के रूप में वे आईएसओ के अनुरूप)।
यदि मानक डिवाइस को इंटरएक्टिव डिवाइस के रूप में संदर्भित किया जा सकता है, तो मानक आउटपुट बफ़र किया जाता है, अन्यथा यह पूरी तरह से बफ़र्ड है। तो ऐसी स्थितियाँ हैं, जहाँ printf
से बाहर नहीं निकलेगा, भले ही उसे बाहर भेजने के लिए एक नई रेखा मिले, जैसे:
myprog >myfile.txt
यह दक्षता के लिए समझ में आता है, यदि आप किसी उपयोगकर्ता के साथ बातचीत कर रहे हैं, तो वे शायद हर पंक्ति को देखना चाहते हैं। यदि आप किसी फ़ाइल में आउटपुट भेज रहे हैं, तो यह सबसे अधिक संभावना है कि दूसरे छोर पर एक उपयोगकर्ता नहीं है (हालांकि असंभव नहीं है, वे फ़ाइल को सिलाई कर सकते हैं)। अब आप तर्क दे सकते हैं कि उपयोगकर्ता हर चरित्र को देखना चाहता है, लेकिन इसके साथ दो समस्याएं हैं।
पहला यह है कि यह बहुत कुशल नहीं है। दूसरा यह है कि मूल एएनएसआई सी जनादेश नए व्यवहार का आविष्कार करने के बजाय मुख्य रूप से मौजूदा व्यवहार को संहिताबद्ध करने के लिए था , और एएनएसआई प्रक्रिया शुरू होने से बहुत पहले उन डिजाइन निर्णयों को बनाया गया था। यहां तक कि आईएसओ आजकल मानकों में मौजूदा नियमों को बदलते समय बहुत सावधानी से चलता है।
इससे कैसे निपटा जाए, यदि आप fflush (stdout)
हर आउटपुट कॉल के बाद जिसे आप तुरंत देखना चाहते हैं, तो यह समस्या को हल कर देगा।
वैकल्पिक रूप से, आप इसे setvbuf
चालू करने से पहले उपयोग करने के लिए उपयोग कर सकते हैं stdout
, इसे अनबाउंड में सेट करने के लिए और आपको fflush
अपने कोड में उन सभी लाइनों को जोड़ने के बारे में चिंता करने की आवश्यकता नहीं होगी :
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
बस ध्यान रखें कि यदि आप फ़ाइल में आउटपुट भेज रहे हैं तो प्रदर्शन को काफी प्रभावित कर सकता है । यह भी ध्यान रखें कि इसके लिए समर्थन कार्यान्वयन-परिभाषित है, मानक द्वारा गारंटी नहीं है।
आईएसओ C99 खंड 7.19.3/3
प्रासंगिक सा है:
जब एक धारा अप्रभावित होती है , तो पात्रों को स्रोत से या गंतव्य पर जल्द से जल्द दिखाई देने का इरादा होता है। अन्यथा वर्णों को एक ब्लॉक के रूप में होस्ट वातावरण से संचित या प्रेषित किया जा सकता है।
जब एक स्ट्रीम पूरी तरह से बफ़र हो जाती है , तो वर्णों को एक बफर के रूप में होस्ट परिवेश से या एक ब्लॉक के रूप में प्रेषित किया जाता है।
जब एक स्ट्रीम को लाइन बफ़र किया जाता है , तो वर्णों को एक नए-पंक्ति वर्ण का सामना करने पर एक ब्लॉक के रूप में या मेजबान वातावरण से प्रेषित किया जाता है।
इसके अलावा, वर्णों को होस्ट वातावरण के लिए एक ब्लॉक के रूप में प्रेषित करने का इरादा है, जब एक बफर भर जाता है, जब इनपुट एक अप्रकाशित स्ट्रीम पर अनुरोध किया जाता है, या जब इनपुट एक लाइन बफ़र स्ट्रीम पर अनुरोध किया जाता है, जिसमें होस्ट वातावरण से वर्णों के प्रसारण की आवश्यकता होती है ।
इन विशेषताओं के लिए समर्थन कार्यान्वयन-परिभाषित है, setbuf
और setvbuf
कार्यों और कार्यों के माध्यम से प्रभावित हो सकता है।