सबसे पहले, कुछ संशोधनवादी इतिहास।
पुराने दिनों में, जब हर कोई इस्तेमाल किया stdio.h
पुस्तकालय मुझे क्या करना/हे, उस पाठ को सहभागी देखा गया था आम तौर पर लाइन बफ़र (या यहां तक unbuffered) था, और पाठ कि था पूरी तरह से बफ़र नहीं किया गया। इसलिए, यदि आप स्ट्रीम में '\n'
आउटपुट करते हैं, तो यह "हमेशा" सही चीज करेगा: लाइन उपयोगकर्ता उपयोगकर्ता को देख रहे थे और तुरंत देखे गए थे, और फ़ाइल को डंप करने वाली लाइनें अधिकतम प्रदर्शन के लिए buffered प्राप्त करती हैं।
दुर्भाग्यवश, यह वास्तव में हमेशा सही बात नहीं है; रनटाइम हमेशा यह अनुमान नहीं लगा सकता कि उपयोगकर्ता वास्तव में आपके प्रोग्राम के आउटपुट को कैसे देखना चाहते हैं। एक आम जाल STDOUT
को पुनर्निर्देशित कर रहा है - लोगों को कंसोल में अपना प्रोग्राम चलाने और आउटपुट (इसके लाइन-बफर किए गए व्यवहार के साथ) को कंसोल में देखने के लिए उपयोग किया जाता है, और फिर किसी भी कारण (जैसे लंबे समय तक चलने वाली नौकरी) के लिए वे STDOUT
को रीडायरेक्ट करने का निर्णय लेते हैं एक फ़ाइल में, और इस तथ्य से तुरंत आश्चर्यचकित हो जाता है कि आउटपुट अब लाइन-बफर नहीं है।
मैंने इस कारण से सुपरकंप्यूटर समय बर्बाद कर दिया है; आउटपुट इतना कम था कि बफरिंग ने किसी को यह बताने में सक्षम होने से रोका कि नौकरी कैसे प्रगति कर रही थी।
सी ++ की iostream
लाइब्रेरी, हालांकि, इसे सही चीज करने के लिए आसान बनाने के लिए डिज़ाइन किया गया था। stdio
के साथ सिंक्रनाइज़ करने के अलावा, यह इस मजाकिया "शायद लाइन-बफर्ड शायद पूरी तरह से बफर" चीज़ नहीं करता है। यह हमेशा पूर्ण बफरिंग का उपयोग करता है (बेशक जब आप अनबफर किए गए सामान को छोड़कर), और यदि आप नई लाइन पर चीजें फिसलना चाहते हैं, तो आप स्पष्ट रूप से करते हैं।
तो यदि आप किसी फ़ाइल में स्वरूपित पाठ का एक गुच्छा डंप कर रहे हैं, तो लोग आपकी लाइन ब्रेक के लिए \n
लिखेंगे।
लेकिन यदि आप टेक्स्ट लिख रहे हैं तो लोग वास्तव में इसे लिखने के दौरान देखना चाहते हैं, तो आप अपनी लाइन ब्रेक के लिए std::endl
का उपयोग करते हैं, और यह तुरंत प्रदर्शित हो जाता है। और यदि आप एक साथ कई लाइनें लिख रहे हैं, तो आप बेहतर भी कर सकते हैं: इंटरमीडिएट लाइन ब्रेक और std::endl
के लिए अंतिम एक (या '\n'
और std::flush
) के लिए '\n'
का उपयोग करें। यद्यपि इस सेटिंग में प्रदर्शन आमतौर पर कोई फर्क नहीं पड़ता है, इसलिए सभी लाइन ब्रेक के लिए केवल std::endl
का उपयोग करना ठीक है।
बफरिंग का उपयोग करते समय, यह संभव है कि आप उपयोगकर्ता से डेटा (प्रॉम्प्ट के साथ) से कुछ संवाद पूछें, और कीबोर्ड से पढ़ने से पहले पाठ मुद्रित नहीं किया गया है। कुछ परिधीय (eg.serial बंदरगाह) के मामले में, यह हो सकता है कि आप बफर को लिखते हैं, और, जब प्रोग्राम बंद हो जाता है, परिधीय भी बंद हो जाता है (और डेटा नहीं भेजा जाता है। – jcoppens