2011-11-14 15 views
55

मैं कुछ और सीखने की कोशिश कर रहा हूं कि I/O धाराएं सी ++ में कैसे काम करती हैं, और मैं वास्तव में उलझन में हूं कि इसका उपयोग कब किया जाए।स्ट्रीमबफ वास्तव में क्या है? मैं इसे कैसे इस्तेमाल करूं?

एक streambuf वास्तव में क्या है?
जब मैं एक streambuf एक istream, या एक vector प्रयोग करते हैं, एक string की तुलना में,? (मैं पहले से ही पिछले तीन पता है, लेकिन नहीं कैसे streambuf अगर यह सब पर करता है, उन्हें तुलना करती है।)

+0

यह एक स्ट्रीम बफर का एक खराब अमूर्त है। – Pubby

+1

@ पब्बी: एर, "स्ट्रीम बफर" क्या है? यह धारा या बफर से अलग कैसे है? – Mehrdad

+0

जो मैं समझता हूं, एक स्ट्रीम इन/आउटपुट को प्रारूपित करता है और इसे अपने बफर में संग्रहीत करता है। – Pubby

उत्तर

38

स्ट्रीम बफ़र्स इनपुट या आउटपुट उपकरणों का प्रतिनिधित्व करते हैं और उस डिवाइस पर बिना प्रारूपित 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> के लिए एक विस्तृत वर्ण स्ट्रीम बफर की तरह दिखने के लिए एक मुखौटा के रूप में कार्य करता है। यह किसी भी लोकेल से जुड़े कोडेकैट पहलू का उपयोग करने के बजाय इसके द्वारा निर्मित कोडेकैट पहलू का उपयोग करता है। आप आम तौर पर उपयुक्त पहलू वाले लोकेल के साथ एक विस्तृत स्ट्रीम बफर का उपयोग कर एक ही प्रभाव प्राप्त कर सकते हैं।

+3

यह 5 साल बहुत देर हो चुकी है, इसलिए मैं इसे एक उत्तर के रूप में पोस्ट नहीं कर रहा हूं और इसे स्वीकार नहीं कर रहा हूं, लेकिन किसी भी व्यक्ति को अभी भी इसे पढ़ने के बाद भी शब्दावली से उलझन में है: 'streambuf' ** कच्चे ** के लिए है डेटा (जैसे कच्चे बाइट, कच्चे इट्स इत्यादि), जबकि 'स्ट्रीम' ** पकाया गया ** डेटा (टेक्स्ट, पाठ के रूप में स्वरूपित पूर्णांक, आदि) के लिए है। एक और तरीका रखो, 'स्ट्रीम' ** पार्सिंग ** (या क्रमबद्धता) परत का प्रतिनिधित्व करता है। सादे तारों से निपटने पर, आप तकनीकी रूप से या तो उपयोग कर सकते हैं, लेकिन अर्थ अलग है: 'streambuf' का अर्थ है कि आप चाहते हैं कि कच्चा डेटा स्वयं स्ट्रिंग हो, जबकि' स्ट्रीम 'एन्कोडिंग को हटा देता है। – Mehrdad

46

streambuf की मदद से, हम एक और भी निचले स्तर में काम कर सकते हैं। यह अंतर्निहित बफर तक पहुंच की अनुमति देता है। , Copy, load, redirect and tee using C++ streambufs और तुलना के संदर्भ में, यह उपयोगी हो सकता है

enter image description here

अधिक जानकारी के लिए देखें::

यहाँ कुछ अच्छे उदाहरण हैं IOstream Library

+3

+1 एक महान लेख को इंगित करने के लिए। – jweyrich

+1

मैंने कुछ ऐसी चीज के लिए खोज की जो स्ट्रीमबफ के साथ-साथ इस आलेख को समझा सके। मुझे खोजने में मदद करने के लिए धन्यवाद! – wvdschel

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