2009-02-07 23 views
17

शैक्षिक उद्देश्यों के लिए मैं करने के लिए एक ostream और धारा बफर बनाना चाहते हैं:मैं अपना खुद का ओस्ट्रीम/स्ट्रीमबफ कैसे बना सकता हूं?

  1. ठीक endians जब < < myVar कर; बजाय एसटीडी का उपयोग करने का एक Deque कंटेनर में
  2. दुकान: इस तरह के रूप अदालत या
  3. लॉग अतिरिक्त डेटा, एक फ़ाइल के लिए लिख रहा < <, कितनी बार मैं .write, बाइट्स की मात्रा मैं लिखा था कि कितनी बार किया था और कितनी बार मैं फ्लश()। लेकिन मुझे सभी जानकारी की आवश्यकता नहीं है।

मैंने ओवरलोडिंग की कोशिश की लेकिन बहुत असफल रहा। मैं अपने basic_stringstream2 कक्षा में

ostream& write(const char* s, streamsize n) 

करके लिखने की कोशिश की अधिक भार (मैं अपने cpp फ़ाइल में पेस्ट basic_stringstream की नकल की और इसे संशोधित), लेकिन कोड basic_ostream का उपयोग कर रखा है। मैंने कोड के माध्यम से देखा और ऐसा लगता है कि मुझे xsputn अधिभारित करने की आवश्यकता है (जो इस पृष्ठ पर उल्लेख नहीं है http://www.cplusplus.com/reference/iostream/ostream) लेकिन मुझे अधिभार के लिए और क्या चाहिए? और मैं अपनी कक्षा कैसे बना सकता हूं (इसे प्राप्त करने की आवश्यकता क्या है, आदि)?

+1

आप कोड का एक अंश है कि "basic_ostream का उपयोग कर रखा है" प्रदान कर सकते हैं? –

उत्तर

23

कैनोलिक दृष्टिकोण में आपके स्वयं के स्ट्रीमबफ को परिभाषित करने में शामिल है। आप पर एक नज़र होनी चाहिए: छानने streambufs पर IOStreams व्युत्पत्ति

  • James Kanze's articles पर

  • 1

    मुझे यकीन नहीं है कि आप जो करना चाहते हैं वह संभव है। << ऑपरेटर आभासी नहीं हैं। तो आप एंड्रियन रूपांतरण और गिनती के साथ जो चाहते हैं उसे करने के लिए yourstream &operator << (yourstream &strm, int i) को परिभाषित कर सकते हैं, और यह तब काम करेगा जब आपका कोड सीधे कॉल करेगा। लेकिन अगर आप एक ऑस्ट्रीम ऑब्जेक्ट को उस फ़ंक्शन में पास करते हैं जो ओस्ट्रीम की अपेक्षा करता है, तो किसी भी समय फ़ंक्शन << पर कॉल करता है, तो यह आपके बजाय मूल ओस्ट्रीम संस्करण पर जाएगा।

    जैसा कि मैं इसे समझता हूं, धाराओं की सुविधाओं को स्थापित किया गया है ताकि आप एक नए प्रकार के प्रकार को परिभाषित कर सकें जो एक अलग प्रकार के बफर (जैसे कहें, वर्णों का एक डेक) का उपयोग करता है, और आप भी बहुत कुछ कर सकते हैं << के माध्यम से अपनी कक्षाओं को आउटपुट करने के लिए आसानी से समर्थन जोड़ें। मुझे नहीं लगता कि आप उन लोगों के बीच मध्य परत को फिर से परिभाषित करने में सक्षम होने का इरादा रखते हैं।

    और विशेष रूप से, << इंटरफ़ेस का पूरा बिंदु अच्छी तरह से स्वरूपित टेक्स्ट आउटपुट प्रदान करना है, जबकि ऐसा लगता है कि आप वास्तव में बाइनरी आउटपुट चाहते हैं। (अन्यथा "एंडियन" के संदर्भ में कोई मतलब नहीं है।) यह भी मानते हुए कि ऐसा करने का कोई तरीका है, मुझे नहीं पता, यह अजीब बाइनरी आउटपुट का सबसे अच्छा उत्पादन करेगा। उदाहरण के लिए, 3 डी स्पेस में एक बिंदु आउटपुट करने के लिए अंतिम उपयोगकर्ता अधिभार पर विचार करें। << का अंतिम उपयोगकर्ता संस्करण शायद << '(' << x << ", " << y << ", " << z << ')' जैसा कुछ करेगा। यह एक टेक्स्ट स्ट्रीम में अच्छा लगेगा, लेकिन यह एक बाइनरी स्ट्रीम में बहुत सारे बर्बाद और पूरी तरह से बेकार पात्र हैं, जो आदर्श रूप से केवल << x << y << z का उपयोग करेंगे। (और << पर कितनी कॉल की गणना की जानी चाहिए?)

    6

    के उदाहरण के लिए boost.iostream) मुझे लगता है कि आप को देखना चाहिए पहलुओं, वे संशोधित करते हैं कि वस्तुओं को वर्णों के रूप में कैसे लिखा जाता है। आप आंकड़े यहां स्टोर कर सकते हैं साथ ही आपने अपनी ऑब्जेक्ट्स को कितनी बार स्ट्रीम किया था। उदाहरण के लिए How to format my own objects when using STL streams? देखें।

    बी के लिए) आपको अपने स्वयं के स्ट्रीमबफ बनाने और अपने ओस्ट्रीम को उस बफर (कन्स्ट्रक्टर तर्क) से कनेक्ट करने की आवश्यकता है। Luc's links + Deriving new streambuf classes देखें।

    • अतिप्रवाह (link)
    • xsputn (एक चार या फ्लश बफर डाल) (बफ़र होना एक चार सरणी डाल) (link)
    • : संक्षेप में आप एक ostream (न्यूनतम) के लिए इस लागू करने की आवश्यकता
    • सिंक (link)
    +0

    इसमें से अधिकांश लिंक अब लटक रहे हैं। – Omnifarious

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

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