2013-08-15 18 views
13

मैं नीचे टुकड़ा बाहर कोशिश कर रहा था, लेकिन यह वांछित आउटपुट न जताए:अंतर stringstream और ostringstream

#include<iostream> 
#include<sstream> 
using namespace std; 
void MyPrint(ostream& stream) 
{ 
    cout<<stream.rdbuf()<< endl; 
} 
int main() 
{ 
    stringstream ss; 
    ss<<"hello there"; 
    MyPrint(ss);    //Prints fine 

    ostringstream oss; 
    oss<<"hello there"; 
    MyPrint(oss);    //Does not print anything 
    getchar(); 
} 

मुझे पता है कि stringstream और ostringstream के बीच ही संभव मतभेद है कि बाद में बलों की दिशा और stringstream से थोड़ा तेज है।

क्या मुझे कुछ भी याद आ रहा है?

पीएस: एक समान प्रश्न पहले पोस्ट किया गया था लेकिन उसे कोई जवाब नहीं मिला।

उत्तर

21

std::stringstream और std::ostringstreamstd::stringbuf पर विभिन्न झंडे पास करें। विशेष रूप से, std::stringbufstd::ostringstream पढ़ने का समर्थन नहीं करता है। और std::cout << stream.rdbuf() स्ट्रीमबफ पर एक पठन ऑपरेशन है।

std::ostringstream से वर्ण निकालने का तरीका std::ostringstream::str() फ़ंक्शन का उपयोग करके पर है।

0

स्ट्रिंगस्ट्रीम को ओस्ट्रिंगस्ट्रीम और आईटिंगस्ट्रीम के द्विदिश कार्यान्वयन के रूप में नहीं माना जाना चाहिए। इसे ostringstream और istringstream दोनों के व्युत्पन्न वर्ग के रूप में कार्यान्वित किया जाता है, यही कारण है कि यह इनपुट और आउटपुट क्षमताओं दोनों लागू करता है।

किस का उपयोग करना है इसका चयन इस बात पर निर्भर करता है कि इसका क्या उपयोग किया जाता है। यदि आपको स्ट्रीम के माध्यम से डेटा तक पहुंचने में सक्षम होने के बिना केवल स्ट्रीम पर डेटा लिखने की आवश्यकता है, तो एक ऑस्ट्रिंगस्ट्रीम आपको चाहिए। हालांकि, यदि आप किसी एपीआई को प्रदान करने वाले किसी चीज़ पर बिडरेक्शनल को कार्यान्वित करना चाहते हैं लेकिन इसे प्रतिबंधित करते हैं, तो आप इसे कास्ट कर सकते हैं:

stringstream ss; // My bidirectional stream 

ostringstream *p_os = &ss; // Now an output stream to be passed to something only allowed to write to it. 

int bytes = collectSomeData(p_oss); 
संबंधित मुद्दे