2010-02-25 12 views
6

क्या कोई मुझे सी ++ में स्ट्रिंग स्ट्रीम का उपयोग करने पर कुछ व्यावहारिक उदाहरणों के बारे में बता सकता है, यानी स्ट्रीम प्रविष्टि और स्ट्रीम निष्कर्षण ऑपरेटरों का उपयोग करके स्ट्रिंग स्ट्रीम में इनपुट और आउटपुट करना?सी ++: स्ट्रिंग स्ट्रीम का क्या लाभ है?

+0

आपका मतलब है सिने और कोउट? सी-स्टाइल getc और printf के विरोध में? –

+2

@ वैनेसा: ओपी का अर्थ है 'std :: stringstream', ('# शामिल ') – Bill

+0

@ बिल: हाँ मेरा मतलब है! –

उत्तर

11

आप स्ट्रिंग धाराओं का उपयोग कुछ भी है कि एक स्ट्रिंग के लिए operator << लागू करता है कन्वर्ट करने के लिए कर सकते हैं:

#include <sstream> 

template<typename T> 
std::string toString(const T& t) 
{ 
    std::ostringstream stream; 
    stream << t; 

    return stream.str(); 
} 

या यहाँ तक कि

template <typename U, typename T> 
U convert(const T& t) 
{ 
    std::stringstream stream; 
    stream << t; 

    U u; 
    stream >> u; 

    return u; 
} 
+0

बस याद रखें कि यह समाधान केवल विशिष्ट वर्गों के साथ 'ऑपरेटर <<' के आदिम प्रकारों और अधिभारित संस्करणों के लिए काम करेगा। – fogo

+1

@fogo: और चूंकि कक्षाओं के लिए स्ट्रीमिंग ऑपरेटरों को परिभाषित करना अपेक्षाकृत आम है, यह इतना बड़ा सौदा नहीं है। –

+0

@ मार्टिन यॉर्क वास्तव में, मैंने जवाब में कुछ भी * टिप्पणी कन्वर्ट करने पर विचार करने के लिए एक उचित टिप्पणी मानी। – fogo

2

फायदे इसके अलावा वहाँ one point to carefully consider अगर आप जीसीसी 4.3.1 का उपयोग करें। मैंने जीसीसी के पिछले संस्करणों की जांच नहीं की थी।

+0

के अनुसार उत्तर संपादित किया यह एक विशिष्ट कार्यान्वयन (जीसीसी) की एक सीमा थी। यह आप समस्या से जुड़े बगजिला बग के माध्यम से लिंक का पालन करते हैं, आप यह भी ध्यान देंगे कि बग को हल किया गया है mutex अब –

+0

का उपयोग नहीं किया गया है तो यह बहुत अच्छा है! मैं यह जानकारी जोड़ने के लिए अपनी पोस्ट संपादित करूंगा कि यह जानकारी केवल जीसीसी के कुछ संस्करणों के लिए प्रासंगिक है। –

2

उन्हें कहीं भी इस्तेमाल किया जा सकता है एक सामान्य धारा का उपयोग किया जा सकता है।

तो ऐसी परिस्थितियों में जहां आप एक फ़ाइल से पढ़ रहे थे, आप संभावित रूप से स्ट्रिंग स्ट्रीम से पढ़ सकते थे।

void compile(std::istream& str) 
{ 
    CPlusPlusLexer lexer(str); 
    CPlusPlusParser parser(lexer); 
    BackEnd   backend(parser); 

    backend.compile(); 
} 

int main() 
{ 
    std::fstream file("Plop.cpp"); 
    compile(file); 

    std::stringstream test("#include <iostream>\n int main() { std::cout << \"H World\n\";}"); 
    compile(test); 
} 
3

मैं उन्हें ज्यादातर स्मृति बफर के रूप में उपयोग करते हैं, बनाने संदेशों में:

if(someVector.size() > MAX_SIZE) 
{ 
    ostringstream buffer; 
    buffer << "Vector should not have " << someVector.size() << " eleements"; 
    throw std::runtime_error(buffer.str()); 
} 

या निर्माण करने के लिए जटिल तार:

std::string MyObject::GenerateDumpPath() 
{ 
    using namespace std; 

    std::ostringstream  dumpPath; 

    // add the file name 
    dumpPath << "\\myobject." 
     << setw(3) << setfill('0') << uniqueFileId 
     << "." << boost::lexical_cast<std::string>(state) 
     << "_" << ymd.year 
     << "." << setw(2) << setfill('0') << ymd.month.as_number() 
     << "." << ymd.day.as_number() 
     << "_" << time.hours() 
     << "." << time.minutes() 
     << "." << time.seconds() 
     << ".xml"; 

    return dumpPath.str(); 
} 

यह उपयोगी है, क्योंकि यह std::stream के सभी तानाना लाता है चरित्र बफर का उपयोग करने के लिए (ostreams एक्स्टेंसिबिलिटी और लोकल सपोर्ट, बफर मेमोरी मैनेजमेंट छुपा हुआ है और इसी तरह)।

एक और उदाहरण मैंने देखा है, gsoap पुस्तकालय में रिपोर्टिंग त्रुटि थी निर्भरता इंजेक्शन का उपयोग कर:। soap_stream_fault में त्रुटि संदेश रिपोर्ट करने के लिए एक ostream & पैरामीटर लेता

क्या आप पास कर सकते हैं यह std :: cerr चाहते हैं, std :: cout या std :: ostringstream कार्यान्वयन (मैं इसे std :: ostringstream कार्यान्वयन के साथ उपयोग करता हूं)।

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