स्ट्रीम बफ़र्स इनपुट या आउटपुट उपकरणों का प्रतिनिधित्व करते हैं और उस डिवाइस पर बिना प्रारूपित I/O के लिए निम्न स्तर का इंटरफ़ेस प्रदान करें। नदियों, दूसरे हाथ पर, बुनियादी अस्वरूपित मैं/हे कार्यों के माध्यम से और विशेष रूप से स्वरूपित मैं/हे कार्यों (जैसे कि, operator<<
और operator>>
भार के) के माध्यम से बफर चारों ओर एक उच्च स्तर आवरण प्रदान करते हैं। स्ट्रीम ऑब्जेक्ट्स स्ट्रीम बफर के जीवनकाल का प्रबंधन भी कर सकते हैं।
उदाहरण के लिए एक फ़ाइल धारा एक आंतरिक फ़ाइल धारा बफर है। धारा बफर के जीवनकाल का प्रबंधन करती है और बफर एक फ़ाइल में वास्तविक पढ़ने और लिखने की क्षमता प्रदान करता है। स्ट्रीम के स्वरूपण ऑपरेटर अंततः स्ट्रीम बफर के अनफॉर्म किए गए I/O फ़ंक्शंस तक पहुंचते हैं, इसलिए आपको केवल स्ट्रीम के I/O फ़ंक्शंस का उपयोग करना होगा, और सीधे बफर के I/O फ़ंक्शंस को स्पर्श करने की आवश्यकता नहीं है।
अंतर को समझने के लिए एक अन्य तरीका विभिन्न उपयोगों के वे स्थान वस्तुओं के बनाने को देखने के लिए है। स्ट्रीम उन प्रारूपों का उपयोग करते हैं जिन्हें स्वरूपण के साथ करना है जैसे कि numpunct
और num_get
। आप यह भी उम्मीद कर सकते हैं कि कस्टम समय या धन डेटा प्रकारों के लिए स्ट्रीम operator<<
और operator>>
के ओवरलोड्स समय और धन स्वरूपण पहलुओं का उपयोग करेंगे। स्ट्रीम बफर, हालांकि, उनके इंटरफ़ेस का उपयोग और बाइट्स के बीच कनवर्ट करने के लिए कोडेकैट पहलुओं का उपयोग करते हैं। इसलिए, उदाहरण के लिए, basic_streambuf<char16_t>
के लिए इंटरफ़ेस char16_t
का उपयोग करता है और इसलिए आंतरिक रूप से codecvt<char16_t, char, mbstate_t>
का उपयोग करता है ताकि अंतर्निहित डिवाइस पर लिखित char
इकाइयों को बफर में लिखे स्वरूपित char16_t
इकाइयों को रूपांतरित किया जा सके। तो आप देख सकते हैं कि स्ट्रीम ज्यादातर प्रारूपण के लिए हैं और स्ट्रीम बफर गैर-स्वरूपित इनपुट या आउटपुट के लिए आउटपुट के लिए निम्न स्तर इंटरफ़ेस प्रदान करते हैं जो एक अलग, बाहरी एन्कोडिंग का उपयोग कर सकते हैं।
आप जब आप एक आई/ओ डिवाइस के लिए केवल अस्वरूपित पहुंच चाहते हैं एक धारा बफर उपयोग कर सकते हैं। यदि आप स्ट्रीम बफर साझा करते हैं तो कई धाराएं सेट करना चाहते हैं, तो आप स्ट्रीम बफर का भी उपयोग कर सकते हैं (हालांकि आपको बफर के जीवनकाल को ध्यान से प्रबंधित करना होगा)। ऐसे विशेष प्रयोजन स्ट्रीम बफर भी हैं जिन्हें आप उपयोग करना चाहते हैं, जैसे wbuffer_convert
सी ++ 11 में जो basic_streambuf<char>
के लिए एक विस्तृत वर्ण स्ट्रीम बफर की तरह दिखने के लिए एक मुखौटा के रूप में कार्य करता है। यह किसी भी लोकेल से जुड़े कोडेकैट पहलू का उपयोग करने के बजाय इसके द्वारा निर्मित कोडेकैट पहलू का उपयोग करता है। आप आम तौर पर उपयुक्त पहलू वाले लोकेल के साथ एक विस्तृत स्ट्रीम बफर का उपयोग कर एक ही प्रभाव प्राप्त कर सकते हैं।
यह एक स्ट्रीम बफर का एक खराब अमूर्त है। – Pubby
@ पब्बी: एर, "स्ट्रीम बफर" क्या है? यह धारा या बफर से अलग कैसे है? – Mehrdad
जो मैं समझता हूं, एक स्ट्रीम इन/आउटपुट को प्रारूपित करता है और इसे अपने बफर में संग्रहीत करता है। – Pubby