2011-07-14 19 views
5

मेरे पास एक स्ट्रिंग है जिसका अंतिम भाग (प्रत्यय) कई बार बदला जाना चाहिए और मुझे नए तार उत्पन्न करने की आवश्यकता है। मैं ऐसा करने के लिए ostringstream का उपयोग करने की कोशिश कर रहा हूं, जैसा कि मुझे लगता है, धाराओं का उपयोग स्ट्रिंग concatenations से तेज होगा। लेकिन जब पिछले प्रत्यय बाद के एक से अधिक है, तो यह गड़बड़ हो जाता है। स्ट्रीम नल पात्रों को भी बंद कर देता है।ओस्ट्रिंगस्ट्रीम स्ट्रिप न्यूल क्यों करता है?

#include<iostream> 
#include<sstream> 

using namespace std; 

int main() 
{ 
    ostringstream os; 
    streampos pos; 
    os << "Hello "; 
    pos = os.tellp(); 
    os << "Universe"; 
    os.seekp(pos); 
    cout<< os.str() << endl; 
    os << "World\0"; 
    cout<< os.str().c_str() << endl; 
    return 0; 
} 

आउटपुट

Hello Universe 
Hello Worldrse 

लेकिन मैं Hello World चाहते हैं। मैं यह कैसे करु? क्या इसे तेजी से करने का कोई और तरीका है?

संपादित करें: std::ends कार्य करता है। लेकिन सोच रहा है कि यह आंतरिक रूप से कैसे काम करता है। यह भी जानना पसंद है कि ऐसा करने के तेज तरीके हैं या नहीं।

+1

इतना यकीन है कि stringstream सबसे कुशल हो जाएगा की तरह सिर्फ कर सकता है - आप 'std :: स्ट्रिंग के वेरिएंट में से एक पर विचार करना चाहिए: : की जगह() ' – Nim

उत्तर

3

यह कुछ भी पट्टी नहीं करता है। सी ++ में सभी स्ट्रिंग अक्षरों को एनयूएल द्वारा समाप्त कर दिया जाता है, इसलिए मैन्युअल रूप से डालने से आप केवल स्ट्रिंग को समाप्त कर सकते हैं, जहां तक ​​कोई भी इसे संसाधित करता है। ostream::write या ostream::put का उपयोग करें, यदि आपको ऐसा करने की आवश्यकता है - char* (आकार के लिए कोई अतिरिक्त तर्क के साथ) की अपेक्षा की जाने वाली किसी भी चीज़ का विशेष रूप से इसका इलाज होगा।

os.write("World\0", 6); 
9

स्ट्रिंग "दुनिया" पहले से ही अशक्त-समाप्त है। इस तरह सी तार काम करते हैं। "विश्व \ 0" में दो \0 वर्ण हैं। इसलिए, operator<<(ostream&, const char*) उनका इलाज करेगा, और सभी वर्णों को \0 तक कॉपी करें। यदि आप os << "World\0!" आज़माते हैं, तो आप इसे और भी स्पष्ट रूप से देख सकते हैं। ! की प्रतिलिपि नहीं बनाई जाएगी, क्योंकि operator<< पहले \0 पर रुक गई थी।

तो, यह ostringstream नहीं है। यह सी स्ट्रिंग्स उर्फ ​​const char* काम करता है।

0

आपको लगता है कि एक स्ट्रीम ऑपरेशन स्ट्रिंग से तेज क्यों है? और cout को आउटपुट करने से पहले स्ट्रिंग का निर्माण क्यों करें?

आप अपने उत्पादन के लिए एक उपसर्ग चाहते हैं आप इसे इस

const std::string prefix = "Hello "; 

std::cout << prefix << "Universe" << std::endl; 
std::cout << prefix << "World" << std::endl; 
नहीं
संबंधित मुद्दे