2011-06-13 19 views
10

मैं वर्तमान में स्ट्रिंगबफ के उप-वर्ग को लागू करने की कोशिश कर रहा हूं ताकि बफर को विशिष्ट वर्णों ('\ n' मेरे मामले में) के लिए टोकननाइज़ करने की अनुमति मिल सके और एक कार्यवाही कर सकें यदि यह char होता है (संदेश को मेरे मामले में बाद में लॉगर और साफ़ बफर को डंप करें)। इस लक्ष्य को प्राप्त करने के लिए, मैंने sputc को ओवरराइड किया ('\ n' के लिए बाहर निकलने के लिए लागू करने के लिए) और xsputn (वास्तव में sputc का उपयोग करने के लिए, क्योंकि जीसीसी कार्यान्वयन डिफ़ॉल्ट रूप से ऐसा नहीं लगता है)। डिबगिंग उद्देश्यों के लिए, मैंने sputc को प्रत्येक वर्ण को लिखने के लिए sputc को छोड़ दिया है।स्ट्रीमबफर कार्यान्वयन के लिए std :: endl और ' n' के बीच मतभेद

अब यह मेरा सवाल यह है: अगर मैं की तरह

mystream << "Some text" << std::endl; 

sputc कुछ '\ n' जो std :: endl द्वारा शामिल किया जाना चाहिए के अलावा प्रत्येक वर्ण प्राप्त करता है का उपयोग करें, तो कार्रवाई है कि उम्मीद है है नहीं किया गया क्योंकि '\ n' पास नहीं हुआ है। अगर मैं

mystream << "Some text" << '\n'; 

या यहाँ तक कि

mystream << "Some text" << "\n" << std::flush; 

सब कुछ उम्मीद और मेरी sputc कार्यान्वयन हो जाता है '\ n' चार रूप में काम करता की तरह कुछ का उपयोग करें।

तो मेरा सवाल यह है: क्या कोड कोड दोनों स्ट्रिंगबफ के पीछे बिल्कुल समान नहीं होनी चाहिए, और यदि नहीं, तो मुझे अन्य तरीकों को '\ n' प्राप्त करने के लिए ओवरराइड करना होगा?

+2

'<< std :: endl' करता है, ठीक है, '<<' \ n '<< std :: flush;'। –

+0

आप जो करने की कोशिश कर रहे हैं उसे करने के आसान तरीके हैं। हो सकता है कि अगर आप असली समस्या के बारे में कोई सवाल पूछें तो आप इसे हल करने के सर्वोत्तम तरीके के बारे में सलाह ले सकते हैं। –

उत्तर

6

आप sputc ओवरराइड नहीं कर सकते क्योंकि sputc वर्चुअल नहीं है। आपको overflow और sync अधिभारित करने की आवश्यकता है और \n की घटनाओं के लिए पूरे लंबित अनुक्रम की जांच करें।

आपको xsputn को अधिभारित करने की आवश्यकता नहीं है जबतक कि आप कुछ इष्टतम नहीं कर सकते क्योंकि आप अपने स्ट्रीम प्रकार का समर्थन करने वाले डिवाइस के बारे में कुछ खास जानते हैं।

+0

मैंने पाया कि कल मैंने खुद को ओवरलोड किया है और ओवरलोड किया है, और अब सबकुछ काम करता है। – crispinus