2012-08-24 21 views
12

ये धागे मुझे जवाब नहीं है:stringstream का पुन: उपयोग करने के लिए कैसे

resetting a stringstream

How do you clear a stringstream variable?

 std::ifstream file(szFIleName_p); 
     if(!file) return false; 

     // create a string stream for parsing 

     std::stringstream szBuffer; 

     std::string szLine;  // current line 
     std::string szKeyWord; // first word on the line identifying what data it contains 

while(!file.eof()){ 

      // read line by line 

      std::getline(file, szLine); 

      // ignore empty lines 

      if(szLine == "") continue; 

      szBuffer.str(""); 
      szBuffer.str(szLine); 
      szBuffer>>szKeyWord; 

szKeyword हमेशा पहला शब्द में शामिल होंगे, szBuffer रीसेट किया जा रहा है, एक नहीं मिल सकता है स्ट्रिंगस्ट्रीम का उपयोग करने के तरीके पर कहीं भी स्पष्ट उदाहरण। जवाब के बाद

नए कोड:

 std::string szLine;  // current line 
     std::string szKeyWord; // first word on the line identifying what data it contains 

     // read line by line 

     while(std::getline(file, szLine)){ 

      // ignore empty lines 

      if(szLine == "") continue; 

      // create a string stream for parsing 

      std::istringstream szBuffer(szLine); 
      szBuffer>>szKeyWord; 
+0

संभावित डुप्लिकेट [ओस्टिंगस्ट्रीम का पुन: उपयोग कैसे करें?] (Http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream) – maxschlepzig

उत्तर

21

आप clear() नहीं धारा किया str("") बुला के बाद:

... 
      szBuffer.str(szLine); 
      szBuffer.clear(); 
      szBuffer>>szKeyWord; 
... 

ठीक है, मेरी अंतिम संस्करण thats। this answer पर एक और नज़र डालें, यह भी बताता है कि आपको str(std::string()) का उपयोग करके रीसेट क्यों करना चाहिए। और आपके मामले में, आप केवल str(szLine) का उपयोग कर सामग्री को रीसेट कर सकते हैं।

आप clear() फोन नहीं है, तो धारा के झंडे (जैसे eof) अभ्यस्त रीसेट, आश्चर्य की बात व्यवहार में परिणित हो;)

+0

बांधना, मैंने एक थ्रेड देखा जो स्पष्ट रूप से त्रुटि झंडे को साफ़ करता है ..wtf आदमी..क्या आप मुझे समझा सकते हैं कि मुझे दोनों की आवश्यकता क्यों है? बस स्पष्ट लगता है काम करने लगता है ..? – Icebone1000

+0

ये संबंधित हैं। यदि आप 'स्पष्ट() 'नहीं कहते हैं, तो स्ट्रीम अभी भी' eof' स्थिति में सोच जाएगी। –

+0

रीसेट पर इतना महत्वपूर्ण कार्य फिर से शुरुआत करने वाले पॉइंटर (जिसे भी कहा जाता है) डाल रहा है? अंत में, मुझे जो चाहिए वह है: szBuffer.str (szLine); szBuffer.clear(); – Icebone1000

7

यह निर्भर करता है कि क्या आप इसके साथ कर रहे हैं। यह आमतौर पर पर एक नया istringstream या ostringstream बनाना आसान है। एक धारा "रीसेट" करने के लिए, आप अपने बफर स्पष्ट करने के लिए, किसी भी त्रुटि झंडे स्पष्ट है, किसी भी स्वरूपण झंडे, प्लस परिशुद्धता रीसेट और भरने, मूल स्थान के साथ फिर से यह imbue, और किसी भी विस्तारित स्वरूपण जानकारी उत्पन्न भूल नहीं xalloc से लौटाए गए मान के साथ। संक्षेप में, के लिए असंभव सही हो।

और जब मैं इसमें हूं, तो आपका पाश गलत है, और संभवतः में अंतिम पंक्ति को दो बार संसाधित किया जाएगा। इनपुट विफल होने के बाद file.eof() में केवल का उपयोग करने योग्य अर्थ है (और फिर भी, यह 100% विश्वसनीय नहीं है)। क्या आप चाहते हैं:

std::string line; 
while (std::getline(file, line)) { 
    if (!line.empty()) { 
     std::istringstream buffer(line); 
     // ... 
    } 
} 

(वास्तव में, आप शायद लाइन से सफेद स्थान अनुगामी खाली के लिए परीक्षण से पहले ट्रिम करने के लिए चाहते हैं।)

+4

मुझे प्यार है कि वहां एक बहुत संगठित और अच्छी तरह से प्रलेखित तरीके से, उन सभी स्पष्ट एसडीडी जानकारी को समझाते हुए कितने संसाधन हैं, न कि – Icebone1000

0

एस एस stringstream है।

  • पहला चरण: ss.clear();
  • दूसरा चरण: ss.str ("");

स्ट्रिंगस्ट्रीम का पुन: उपयोग करने के लिए - स्ट्रिंग स्ट्रीम को पूरी तरह साफ़ करें।

1

ज्यादातर मामलों में, इसे रीसेट करने के बजाय एक नया istringstream या ostringstream बनाना आसान है।

हालांकि, अगर आप उन्हें क्रोध करना चाहते हैं:

  • धारा के क्रोध झंडे (अप्रत्याशित व्यवहार से बचने के लिए) clear() का उपयोग कर।

  • आप, str ("") का उपयोग कर दक्षता प्रयोजनों के लिए अपने stringstream की सामग्री को सही कर सकते हैं जब तक हम str(std::string()) पसंद कर सकते हैं।

0

आप एक वर्ग के सदस्य में धारा, उपयोग unique_ptr<stringstream>, है तो बस reset(new stringstream(...)) यह पुन: उपयोग करने के लिए।