2012-01-11 12 views
14

जब मैं स्ट्रिंगस्ट्रीम में कुछ डालता हूं, तो एक असली संख्या कहें, अगर मैं उस स्ट्रिंगस्ट्रीम ऑब्जेक्ट को cout में डालता हूं ... मैं क्या देख रहा हूं?cout << स्ट्रिंगस्ट्रीम

आमतौर पर मुझे कुछ अजीब संख्या मिल रही है। क्या यह एक स्मृति स्थान है? बस उत्सुक।

ऐसा लगता है कि नीचे टिप्पणी है जैसे कि यह मारा लेकिन यहाँ मैं क्या करने की कोशिश कर रहा हूँ है:

string stringIn; 
stringstream holdBuff; 
holdBuff << getline(cin, stringIn); 
cout << holdBuff; 

असल में मैं सिर्फ देखने के लिए क्या holdBuff की तरह एक बार मैं stringIn डाला देखा कोशिश कर रहा था। मैं उपयोगकर्ता एक स्ट्रिंग दर्ज करने के लिए कोशिश कर रहा हूँ और फिर मैं इसे यह की सामग्री की तलाश में और possilbly परिवर्तित करने से निकलने के लिए चाहते हैं ...

उत्तर

19

आपको क्या लगता है

holdBuff << getline(cin, stringIn); 

कर रहा है। getline का वापसी प्रकार इस मामले में पढ़ने (cin) स्ट्रीम का संदर्भ है। चूंकि कोई << परिभाषित जो दूसरा तर्क के रूप में एक std::istream ले जाता है, संकलक अलग रूपांतरण की कोशिश करता है: सी ++ 11, std::istream में bool को एक अंतर्निहित रूपांतरण है, और पहले C++, std::ios*, या कुछ करने के लिए एक अंतर्निहित रूपांतरण समान (लेकिन लौटाए गए मान का एकमात्र वैध उपयोग को bool में परिवर्तित करें)। तो आप या तो आउटपुट 1 (सी ++ 11), या कुछ यादृच्छिक पता (अभ्यास में, आमतौर पर स्ट्रीम का पता, लेकिन यह की गारंटी नहीं है)।एक std::ostringstream,

की सामग्री लिखने के लिए

if (!getline(std::cin, stringIn)) 
    // Error handling here... 
holdBuff << stringIn; 

इसी तरह,: यदि आप एक std::ostringstream में getline के लिए एक कॉल के परिणाम प्राप्त करना चाहते हैं, तो आप दो आपरेशन (उन दोनों के बीच त्रुटियों के लिए एक चेक के साथ) की आवश्यकता

std::cout << holdBuf.str() ; 

सही समाधान है। आप एक std::stringstream का उपयोग करते समय एक std::ostringstream अधिक उचित होगा पर जोर देते हैं, तो आप भी कर सकते हैं:

std::cout << holdBuf.rdbuf(); 

पहला समाधान बेहतर है, हालांकि, के रूप में यह कहीं अधिक मुहावरेदार है।

किसी भी मामले में, एक बार फिर, वहाँ कोई << ऑपरेटर कि, किसी भी iostream प्रकार लेता है ताकि आप bool या एक सूचक को निहित रूपांतरण के परिणामों के साथ पहुंचते हैं।

+0

बहुत बहुत धन्यवाद जेम्स। महान जानकारी। मुझे ostringstream बनाम स्ट्रिंगस्ट्रीम के बीच अंतर देखना होगा। क्या संभवतः मिश्रित प्रकार की रेखा में खींचने के लिए अच्छा/प्रवेश स्तर तरीका है? धन्यवाद। – MCP

2
cout << s.rdbuf(); 

तुम क्या चाहते है। वैकल्पिक रूप से आप

count << s.str(); 

जो संसाधनों के मामले में अधिक महंगा हो सकता है।

13

हां, आपको स्ट्रिंगस्ट्रीम का पता देखने की संभावना है।

आप स्ट्रिंग इसमें प्रदर्शित करने के लिए चाहते हैं, कोशिश

cout << stream.str(); 
+0

यह बफर की एक प्रति बनाता है क्योंकि str() मूल्य से लौटाता है। –

5

हाँ, यह है सबसे अधिक संभावना है किसी न किसी रूप या अन्य की एक स्मृति स्थान। सबसे अधिक संभावना है कि यह स्ट्रिंगस्ट्रीम ऑब्जेक्ट के लिए सूचक है।

आप इस इस प्रकार की पुष्टि कर सकते:

std::stringstream ss; 
unsigned long long ll = (unsigned long long)&ss; 
cout << ll; 

कहा कि जब आप एक stringstream अदालत को आप str() फ़ंक्शन के रूप में इस का उपयोग करना चाहिए हैं:

cout << ss.str(); 

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

  • कोई संबंधित समस्या नहीं^_^