2010-09-21 10 views
6

मैं एक असाइनमेंट के लिए स्ट्रिंगस्ट्रीम के साथ प्रयोग करना चाहता था, लेकिन मैं थोड़ा काम करता हूं कि यह कैसे काम करता है। मैंने एक त्वरित खोज की लेकिन मुझे कुछ भी नहीं मिला जो मेरे प्रश्न का उत्तर देगा।गतिशील आकार के साथ स्ट्रिंगस्ट्रीम को कैसे पढ़ा जाए?

कहें कि मेरे पास गतिशील आकार वाला एक स्ट्रीम है, मुझे कैसे पता चलेगा कि चर को लिखना बंद करना कब होगा?

string var = "2 ++ asdf 3 * c"; 
stringstream ss; 

ss << var; 

while(ss){ 
    ss >> var; 
    cout << var << endl; 
} 

और मेरे उत्पादन होगा:

2 
++ 
asdf 
3 
* 
c 
c 

मैं क्यों मैं यकीन नहीं है कि अतिरिक्त अंत में 'सी', खासकर जब से _M_in_cur = 0x1001000d7 ""

+0

तथ्य यह है कि यह एक स्ट्रिंगस्ट्रीम है जो कुछ भी नहीं बदलता है - आप इससे पढ़ते हैं जैसे कि आप किसी अन्य स्ट्रीम की तरह। –

उत्तर

17

आप मिल अंत में अतिरिक्त c क्योंकि आप निष्कर्ष निकालने के बाद स्ट्रीम अभी भी अच्छा नहीं है:

while (ss)  // test if stream is good 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 

जब आप निष्कर्षण निष्पादित करते हैं और परिणाम का उपयोग करते समय आपको स्ट्रीम स्थिति का परीक्षण करने की आवश्यकता होती है। आम तौर पर यह पाश हालत में निष्कर्षण प्रदर्शन से किया जाता है:

while (ss >> var) // attempt extraction then test if stream is good 
{ 
    cout << var; // use result of extraction 
} 
+0

धन्यवाद, मुझे लगता है कि मेरा प्रश्न स्ट्रीम किया गया है कि धारा की स्थिति की जांच कैसे करें। –

+0

@ thomast.sang उसका जवाब स्वीकार करते हैं। – gsamaras

-1

वहाँ भी है एक सदस्य समारोह अच्छा() जो धारा आई/ओ के संचालन के लिए इस्तेमाल किया जा सकता है, तो परीक्षण करती है। तो इस का उपयोग करके उपरोक्त कोड अपने कोड की जाँच में

while(ss.good()) // check if the stream can be used for io 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 
+1

यह सामान्य मामले में अभी भी गलत है: यदि आप 'int' निकालने का प्रयास कर रहे हैं और बफर में अगले उपलब्ध वर्णों को 'int' के रूप में नहीं पढ़ा जा सकता है, तो निष्कर्षण विफल हो जाएगा। –

0

while(ss) हालत की जांच में बदला जा सकता है, तो धारा से पिछले पढ़ने सफल या नहीं था। हालांकि, यह जांच तब भी सही हो जाएगी जब आपने अपनी स्ट्रिंग में अंतिम शब्द पढ़ा हो। आपके कोड में केवल ss >> var का अगला निष्कर्षण इस स्थिति को झूठा बनाने जा रहा है क्योंकि स्ट्रीम के अंत तक पहुंच गया है & परिवर्तनीय var में निकालने के लिए कुछ भी नहीं है। यही कारण है कि आप अंत में एक अतिरिक्त 'सी' प्राप्त करते हैं। जेम्स मैकनेलिस द्वारा सुझाए गए अनुसार अपना कोड बदलकर आप इसे खत्म कर सकते हैं।

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