आप एक स्ट्रिंगस्ट्रीम चर को कैसे साफ़ करते हैं?


486

मैंने पहले से ही कई चीजों की कोशिश की है,

std::stringstream m;
m.empty();
m.clear();

दोनों काम नहीं करते।

जवाबों:


771

सभी मानक लाइब्रेरी प्रकारों के लिए सदस्य फ़ंक्शन empty()एक क्वेरी है, न कि कमांड, अर्थात इसका अर्थ है "क्या आप खाली हैं?" नहीं "कृपया अपनी सामग्री फेंक दें"।

clear()सदस्य समारोह से विरासत में मिला है iosऔर अगर एक फ़ाइल धारा में त्रुटि राज्य सेट है धारा, जैसे की त्रुटि राज्य स्पष्ट करने के लिए प्रयोग किया जाता है eofbit(अंत के फ़ाइल), तो बुला clear()करने के लिए त्रुटि राज्य वापस कर देगा goodbit(कोई त्रुटि) ।

stringstreamका उपयोग कर, की सामग्री को साफ़ करने के लिए :

m.str("");

सही है, हालांकि उपयोग कर रहा है:

m.str(std::string());

तकनीकी रूप से अधिक कुशल है, क्योंकि आप std::stringकंस्ट्रक्टर को लेने से बचते हैं const char*। लेकिन इन दिनों किसी भी संकलक को दोनों मामलों में एक ही कोड उत्पन्न करने में सक्षम होना चाहिए - इसलिए मैं जो भी अधिक पठनीय है, उसके साथ जाऊंगा।


105
यहाँ तब होता है जब आप "स्पष्ट ()" भाग को भूल जाते हैं। stackoverflow.com/q/2848087/635549
गलाथ

8
@KshitijBanerjee मुझे लगता है कि C ++ m.str () और m.str ("") दो अलग-अलग कार्य हैं। m.str () एक फ़ंक्शन को आमंत्रित करता है, जो किसी भी पैरामीटर की उम्मीद नहीं करता था जबकि m.str ("") फ़ंक्शन का आह्वान करेगा जो एक कॉन्स्टर्ड चार * पैरामीटर को स्वीकार करता है। m.str () एक के रूप में लागू किया गया है हो सकता है प्राप्त समारोह जो स्ट्रिंग जबकि m.str ( "") एक के रूप में लागू किया गया है हो सकता है रिटर्न सेट समारोह।
दिनेश पीआर

4
जैसा कि गैलैथ ने कहा कि m.clear () को जोड़ना भी बहुत महत्वपूर्ण है; m.str ("") के अलावा; - अन्यथा आप समस्याएं प्राप्त कर सकते हैं यदि कुछ बिंदु पर आप एक स्ट्रिंग के साथ स्ट्रिंग को भरते हैं।
स्पुतनिक

1
@anthropod हाँ जो पिछले साल था। मैंने तब से काम कर लिया है।
जेम्स

1
अरे लड़का यह सहज है। बस सी ++ के बारे में सब कुछ की तरह!
धूप चंद्रमा

47

आप त्रुटि स्थिति को साफ़ कर सकते हैं और एक लाइन में सभी स्ट्रिंगस्ट्रीम को खाली कर सकते हैं

std::stringstream().swap(m); // swap m with a default constructed stringstream

यह प्रभावी रूप से एक डिफ़ॉल्ट निर्मित अवस्था में m को रीसेट करता है


3
यह अन्य सभी उत्तरों की तुलना में यह सबसे कुशल और सबसे सुंदर तरीका है। हालाँकि, std :: stringstream :: swap एक c ++ 11 सुविधा है और यह समाधान पूर्व c ++ 11 संकलक के लिए काम नहीं करता है।
101010

4
GNU g ++ v4.8 में अभी भी मौजूद फ़ीचर, देखें stackoverflow.com/questions/24429441/…
Joachim W

7
@ 101010: मूव-असाइनमेंट से बेहतर स्वैपिंग कैसे होती है?
डिडुप्लीकेटर

2
@AsetD: भले ही यह noexcept हो, क्या आप डिफ़ॉल्ट-निर्मित अस्थायी भूल गए?
Deduplicator

3
यह कम संयोग है। जब मैं मूल एसएस का उपयोग करना चाहता हूं। यह मेरे लिए एक खाली स्वैप करता है।
जांग


33

यह संकलक की परवाह किए बिना सबसे विश्वसनीय तरीका होना चाहिए:

m=std::stringstream();

2
यह मेरी राय में बेहतर है क्योंकि m.str (""); मेरे स्ट्रैस्टस्ट के कारण उस खाली मूल्य के साथ फंस गया जो मैंने कोशिश की। लेकिन इसके उपयोग से मुझे वह समस्या नहीं है
जिलेटिन 1

3
मैं उसी समस्या में भाग गया, मेरे mm.clear(); mm.str("");लिए चाल चली । (कोई सी ++ 11, अन्यथा स्वैप बेहतर होगा)।
hochl

1
@ भच: swapचाल-असाइनमेंट से बेहतर क्यों होगा ?
डिडुप्लिकेटर

4
यह सभी स्थिति के लिए अच्छा नहीं है। यह हर बार बफर को फिर से आवंटित करेगा जबकि mm.str ("") नहीं होगा।
शीतल शाह

3
एक स्ट्रिंगस्ट्रीम ऑब्जेक्ट को फ्लश करने के लिए मेरा प्राथमिक उपयोग-केस स्ट्रिंगस्ट्रीम के अनावश्यक तात्कालिकता को रोकने के लिए एक थ्रेडोकोलॉस्ट स्ट्रिंग ऑब्जेक्ट को चारों ओर रख रहा है - एक नए स्ट्रीस्टस्ट ऑब्जेक्ट को तत्काल ग्लोबल लोकल ऑब्जेक्ट को कॉपी करता है - सैद्धांतिक रूप से यह त्वरित और केवल एक परमाणु वृद्धि है, लेकिन समसामयिकता के स्तर पर मैं अक्सर इसे अपंग करता हूं।
Spacemoose

12

मैं हमेशा इसे डांट रहा हूं:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

क्या यह समाशोधन से बेहतर हैstringstream?
Robur_131

11

मेरे 2 सेंट:

यह मेरे लिए xcode और dev-c ++ में काम करता प्रतीत हुआ, मेरे पास एक मेनू के रूप में एक कार्यक्रम था कि यदि उपयोगकर्ता के अनुरोध के अनुसार इसे निष्पादित किया जाता है, तो एक स्ट्रिंगस्ट्रीम चर भर जाएगा जो पहली बार कोड ठीक काम करेगा। अगली बार जब उपयोगकर्ता एक ही कोड चलाएगा, तो उसे चलाएं, लेकिन यह स्पष्ट नहीं होगा। लेकिन नीचे दिए गए कोड की दो लाइनों ने स्ट्रिंग चर को भरने से पहले स्ट्रिंगस्ट्रीम चर को हर बार साफ कर दिया। (2 घंटे का परीक्षण और त्रुटि और Google खोज), btw, अपने दम पर प्रत्येक पंक्ति का उपयोग कर चाल नहीं चलेगा।

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";

-1

यह एक वैचारिक समस्या है।

स्ट्रिंगस्ट्रीम एक धारा है, इसलिए इसके पुनरावृत्त आगे हैं, वापस नहीं लौट सकते। एक आउटपुट स्ट्रिंगस्ट्रीम में, आपको इसे किसी भी अन्य आउटपुट स्ट्रीम की तरह, इसे फिर से संगठित करने के लिए फ्लश () की आवश्यकता होती है।


1
en.cppreference.com/w/cpp/io/basic_ostream/flush फ्लश के साथ सिंक्रनाइज़ किए गए संग्रहण डिवाइस के साथ सिंक्रनाइज़ किया जाता है। यह वही पुनर्निवेश नहीं है।
स्पष्ट

-11

ये gnu c ++ में स्ट्रिंगस्ट्रीम में डेटा को नहीं छोड़ते हैं

    m.str("");
    m.str() = "";
    m.str(std::string());

निम्नलिखित मेरे लिए स्ट्रिंग को खाली करता है:

    m.str().clear();

7
मुझे यकीन नहीं है कि यह काम करेगा, क्योंकि उन्हीं कारणों से बर्नहार्ड्रश काम नहीं करेगा। .Str () फ़ंक्शन एक प्रतिलिपि लौटाता है, और प्रतिलिपि साफ़ करने से कुछ भी नहीं होगा।
वेरडगन

1
यह समाधान Microsoft Visual C ++ के लिए काम नहीं करता है।
ज़क

गलत। स्पष्ट धारा से लौटे स्ट्रिंग पर काम कर रहा होगा, धारा ही नहीं।
जॉय कार्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.