c++ - tutorial - स्ट्रिंगस्ट्रीम वास्तव में क्या करता है?




the c++ programming language (3)

मैं कल से सी ++ सीखने की कोशिश कर रहा हूं और मैं इस दस्तावेज़ का उपयोग कर रहा हूं: http://www.cplusplus.com/files/tutorial.pdf (पेज 32)। मुझे दस्तावेज़ में एक कोड मिला और मैंने इसे चलाया। मैंने कीमत के लिए 5.5 रुपये और मात्रा के लिए एक पूर्णांक इनपुट करने की कोशिश की और आउटपुट 0 था। मैंने 5.5 और 6 इनपुट करने की कोशिश की और आउटपुट सही था।

// stringstreams
#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

int main () 
{ 
  string mystr; 
  float price = 0; 
  int quantity = 0; 

  cout << "Enter price: "; 
  getline (cin,mystr); 
  stringstream(mystr) >> price; 
  cout << "Enter quantity: "; 
  getline (cin,mystr); 
  stringstream(mystr) >> quantity; 
  cout << "Total price: " << price*quantity << endl; 
  return 0; 
}

प्रश्न: mystring आदेश वास्तव में क्या करता है? दस्तावेज़ से उद्धरण:

"इस उदाहरण में, हम मानक इनपुट से अप्रत्यक्ष मूल्यों को अप्रत्यक्ष रूप से प्राप्त करते हैं। मानक इनपुट से सीधे संख्यात्मक मान निकालने के बजाय, हमें मानक इनपुट (cin) से स्ट्रिंग ऑब्जेक्ट (mystr) में रेखाएं मिलती हैं, और फिर हम पूर्णांक निकालते हैं इस स्ट्रिंग से मान प्रकार int (मात्रा) के चर में। "

मेरी धारणा यह थी कि फ़ंक्शन एक स्ट्रिंग का अभिन्न हिस्सा लेगा और इनपुट के रूप में उपयोग करेगा।

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


आपने mystr में एक अल्फान्यूमेरिक और int, रिक्त mystr

फिर आपने पहले टोकन (रिक्त सीमांकित) को int में बदलने की कोशिश की।

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

जब आप केवल दूसरी बार int मान दर्ज करते हैं, तो सब कुछ आपके द्वारा अपेक्षित काम करता था।

यह नकली आरएस था जिसने आपका कोड असफल कर दिया।


कभी-कभी स्ट्रिंग्स और अन्य संख्यात्मक प्रकारों के बीच कनवर्ट करने के लिए स्ट्रिंगस्ट्रीम का उपयोग करना बहुत सुविधाजनक होता है। stringstream का उपयोग iostream के उपयोग के समान है, इसलिए यह सीखने का बोझ नहीं है।

स्ट्रिंगस्ट्रीम का उपयोग तारों को पढ़ने और स्ट्रिंग में डेटा लिखने के लिए किया जा सकता है। यह मुख्य रूप से एक स्ट्रिंग बफर के साथ काम करता है, लेकिन असली I / O चैनल के बिना।

स्ट्रिंगस्ट्रीम कक्षा के मूल सदस्य कार्य हैं

  • str() , जो स्ट्रिंग प्रकार में अपने बफर की सामग्री देता है।

  • str(string) , जो बफर की सामग्री को स्ट्रिंग तर्क में सेट करता है।

स्ट्रिंग स्ट्रीम का उपयोग करने का उदाहरण यहां दिया गया है।

ostringstream os;
os << "dec: " << 15 << " hex: " << std::hex << 15 << endl;
cout << os.str() << endl;

परिणाम dec: 15 hex: f

istringstream एक ही उपयोग के कम या कम है।

संक्षेप में, स्ट्रिंगस्ट्रीम एक स्वतंत्र I / O डिवाइस जैसे तारों को कुशल बनाने का एक सुविधाजनक तरीका है

एफवाईआई, कक्षाओं के बीच विरासत संबंध हैं:


सी ++ प्राइमर से :

Istringstream प्रकार एक स्ट्रिंग पढ़ता है, ostringstream एक स्ट्रिंग लिखता है, और स्ट्रिंगस्ट्रीम स्ट्रिंग को पढ़ता है और लिखता है।

मैं कुछ मामलों में आया हूं जहां स्ट्रिंगस्ट्रीम का उपयोग करने के लिए यह सुविधाजनक और संक्षिप्त दोनों है।

मामला एक

यह इस लीटकोड समस्या के समाधानों में से एक है । यह एक बहुत ही उपयुक्त मामला प्रदर्शित करता है जहां स्ट्रिंगस्ट्रीम का उपयोग कुशल और संक्षिप्त है।

मान लीजिए a और b स्ट्रिंग प्रारूप में व्यक्त जटिल संख्याएं हैं, हम स्ट्रिंग प्रारूप में a और b के गुणा के परिणाम प्राप्त करना चाहते हैं। कोड निम्नानुसार है:

string a = "1+2i", b = "1+3i";
istringstream sa(a), sb(b);
ostringstream out;

int ra, ia, rb, ib;
char buff;
// only read integer values to get the real and imaginary part of 
// of the original complex number
sa >> ra >> buff >> ia >> buff;
sb >> rb >> buff >> ib >> buff;

out << ra*rb-ia*ib << '+' << ra*ib+ia*rb << 'i';

// final result in string format
string result = out.str() 

मामला 2

यह एक लीटकोड समस्या से भी है जिसके लिए आपको दिए गए पथ स्ट्रिंग को सरल बनाना आवश्यक है, स्ट्रिंगस्ट्रीम का उपयोग करने वाले समाधानों में से एक सबसे सुंदर है जिसे मैंने देखा है:

string simplifyPath(string path) {
    string res, tmp;
    vector<string> stk;
    stringstream ss(path);
    while(getline(ss,tmp,'/')) {
        if (tmp == "" or tmp == ".") continue;
        if (tmp == ".." and !stk.empty()) stk.pop_back();
        else if (tmp != "..") stk.push_back(tmp);
    }
    for(auto str : stk) res += "/"+str;
    return res.empty() ? "/" : res; 
 }

स्ट्रिंगस्ट्रीम के उपयोग के बिना, इस तरह के संक्षिप्त कोड लिखना मुश्किल होगा।





c++