Istringstream, ostringstream और stringstream के बीच अंतर क्या है? / हर मामले में स्ट्रिंगस्ट्रीम का उपयोग क्यों नहीं किया जाता है?


163

मैं कब उपयोग करूंगा std::istringstream, std::ostringstreamऔर std::stringstreamमुझे std::stringstreamहर परिदृश्य में उपयोग क्यों नहीं करना चाहिए (क्या कोई रनटाइम प्रदर्शन समस्या है?)।

अंत में, क्या इस बारे में कुछ बुरा है (एक धारा का उपयोग करने के बजाय)

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";

जवाबों:


119

व्यक्तिगत रूप से, मुझे यह बहुत दुर्लभ लगता है कि मैं एक ही स्ट्रिंग स्ट्रीम में और बाहर स्ट्रीमिंग करना चाहता हूं।

आमतौर पर मैं या तो एक स्ट्रिंग से एक धारा को इनिशियलाइज़ करना चाहता हूं और फिर उसे पार्स करता हूं; या स्ट्रिंग स्ट्रिंग पर चीजों को स्ट्रीम करें और फिर परिणाम निकालें और इसे स्टोर करें।

यदि आप एक ही स्ट्रीम से स्ट्रीम कर रहे हैं, तो आपको स्ट्रीम स्टेट और स्ट्रीम पोजिशन से बहुत सावधान रहना होगा।

'सिर्फ' istringstreamया ostringstreamबेहतर का उपयोग करना आपके इरादे को व्यक्त करता है और आपको कुछ गलतियों के खिलाफ जाँच देता है जैसे कि <<बनाम का आकस्मिक उपयोग >>

वहाँ हो सकता है कुछ प्रदर्शन में सुधार हो सकता है लेकिन मुझे लगता है कि पहली बार में देख नहीं किया जाएगा।

आपके द्वारा लिखे गए कुछ भी गलत नहीं है। यदि आप पाते हैं कि यह पर्याप्त रूप से अच्छा प्रदर्शन नहीं करता है, तो आप अन्य दृष्टिकोणों को प्रोफाइल कर सकते हैं, अन्यथा स्पष्टता के साथ रहें। व्यक्तिगत रूप से, मैं सिर्फ इसके लिए जाऊंगा:

std::string stHehe( "Hello stackoverflow.com!" );

22

A stringstreamकुछ बड़ा है, और इसमें थोड़ा कम प्रदर्शन हो सकता है - एकाधिक वंशानुक्रम को vtable सूचक को समायोजन की आवश्यकता हो सकती है। मुख्य अंतर है (कम से कम सिद्धांत में) बेहतर ढंग से अपने इरादे को व्यक्त करना, और >>जहां आप इरादा था <<(या इसके विपरीत) का उपयोग करके आपको गलती से रोकना । OTOH, अंतर पर्याप्त रूप से छोटा है कि विशेष रूप से प्रदर्शन कोड के त्वरित बिट्स के लिए और इस तरह, मैं आलसी हूं और बस उपयोग करता हूं stringstream। मैं काफी पिछली बार मैं गलती से इस्तेमाल किया याद नहीं कर सकते <<जब मैं इरादा >>है, तो मेरे लिए सुरक्षा की कि बिट ज्यादातर सैद्धांतिक लगता है (विशेष रूप से यदि आप करते हैं इस तरह के एक गलती करते हैं, यह लगभग हमेशा हो जाएगा वास्तव में स्पष्ट लगभग तुरंत)।

केवल एक स्ट्रिंग का उपयोग करने के साथ कुछ भी गलत नहीं है, जब तक कि यह पूरा हो जाए कि आप क्या चाहते हैं। यदि आप केवल एक साथ तार लगा रहे हैं, तो यह आसान है और ठीक काम करता है। यदि आप अन्य प्रकार के डेटा को प्रारूपित करना चाहते हैं, तो एक stringstreamसमर्थन करेगा, और एक स्ट्रिंग ज्यादातर नहीं होगा।


17

ज्यादातर मामलों में, आप स्वयं को एक ही स्ट्रिंग पर इनपुट और आउटपुट दोनों की आवश्यकता नहीं पाएंगे, इसलिए उपयोग करना std::ostringstreamऔर std::istringstreamस्पष्ट रूप से आपके इरादे को स्पष्ट करता है। यह आपको गलती से गलत ऑपरेटर ( <<बनाम >>) टाइप करने से भी रोकता है ।

जब आपको एक ही स्ट्रीम पर दोनों ऑपरेशन करने की आवश्यकता होती है तो आप स्पष्ट रूप से सामान्य उद्देश्य संस्करण का उपयोग करेंगे।

प्रदर्शन के मुद्दे यहां आपकी चिंताओं में से कम से कम होंगे, स्पष्टता मुख्य लाभ है।

अंत में स्ट्रिंग एपेंड का उपयोग करने में कुछ भी गलत नहीं है क्योंकि आपको शुद्ध तार का निर्माण करना होगा। आप बस इसका उपयोग नहीं कर सकते हैं जैसे कि आप पर्ल जैसी भाषाओं में संख्याओं को जोड़ सकते हैं।


8

istringstream इनपुट के लिए है, आउटपुट के लिए ostringstream। stringstream इनपुट और आउटपुट है। आप हर जगह स्ट्रिंगस्ट्रीम का बहुत अधिक उपयोग कर सकते हैं। हालाँकि, यदि आप किसी अन्य उपयोगकर्ता को अपना ऑब्जेक्ट देते हैं, और यह ऑपरेटर का उपयोग करता है >> जबकि आप केवल एक ऑब्जेक्ट का इंतजार कर रहे हैं, तो आप खुश नहीं होंगे;;

पुनश्च: इसके बारे में कुछ भी बुरा नहीं है, सिर्फ प्रदर्शन के मुद्दे।


2

अपने तीसरे प्रश्न का उत्तर देने के लिए: नहीं, यह पूरी तरह से उचित है। धाराओं का उपयोग करने का लाभ यह है कि आप किसी भी प्रकार के मूल्य में प्रवेश कर सकते हैं जो operator<<परिभाषित है, जबकि आप केवल तार जोड़ सकते हैं (या तो C ++ या C) a std::string


1

संभवतः जब आपके ऑपरेशन के लिए केवल सम्मिलन या केवल निष्कर्षण ही उपयुक्त हो तो आप अवांछित ऑपरेशन को बाहर करने के लिए 'i' या 'o' उपसर्गों में से एक का उपयोग कर सकते हैं।

यदि वह महत्वपूर्ण नहीं है, तो आप i / o संस्करण का उपयोग कर सकते हैं।

आपके द्वारा दिखाया जा रहा स्ट्रिंग कॉन्फेंशन पूरी तरह से मान्य है। हालांकि स्ट्रिंगस्ट्रीम का उपयोग करना संभव है जो स्ट्रिंगस्ट्रीम की सबसे उपयोगी विशेषता नहीं है, जो कि POD और अमूर्त डेटा प्रकारों को सम्मिलित करने और निकालने में सक्षम है।


1

std :: ostringstream :: str () स्ट्रीम की सामग्री की एक प्रति बनाता है, जो कुछ स्थितियों में मेमोरी के उपयोग को दोगुना कर देता है। इससे बचने के लिए आप std :: stringstream और इसके rdbuf () फ़ंक्शन का उपयोग कर सकते हैं।

यहाँ अधिक जानकारी: कैसे cout करने के लिए सीधे शिरोबिंदु लिखने के लिए


0

उदाहरण के लिए, यदि आपको केवल पढ़ने की आवश्यकता है, तो रीड / राइट एक्सेस के लिए फाइल क्यों खोलें?

क्या होगा यदि एक ही फ़ाइल से कई प्रक्रियाओं को पढ़ने की आवश्यकता है?

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