স্ট্রিংস্ট্রিম ঠিক কী করে?


107

আমি গতকাল থেকে সি ++ শিখার চেষ্টা করছি এবং আমি এই দস্তাবেজটি ব্যবহার করছি: http://www.cplsplus.com/files/tutorial.pdf (পৃষ্ঠা 32)। আমি দস্তাবেজে একটি কোড পেয়েছি এবং এটি চালিয়েছি। আমি দামের জন্য 5.5 টাকা এবং পরিমাণের জন্য একটি পূর্ণসংখ্যা এবং আউটপুট 0 আউটপুট দেওয়ার চেষ্টা করেছি 5.৫ এবং input আউটপুট দেওয়ার চেষ্টা করেছি এবং আউটপুটটি সঠিক ছিল।

// 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; 
}

প্রশ্ন: মাইস্ট্রিং কমান্ডটি ঠিক কী করে? দস্তাবেজ থেকে উদ্ধৃতি:

"এই উদাহরণে, আমরা স্ট্যান্ডার্ড ইনপুট থেকে অপ্রত্যক্ষভাবে সংখ্যাসূচক মানগুলি অর্জন করি input স্ট্যান্ডার্ড ইনপুট থেকে সরাসরি সংখ্যার মানগুলি বের করার পরিবর্তে আমরা স্ট্যান্ডার্ড অবজেক্টে (মাইরিস্ট) স্ট্যান্ডার্ড ইনপুট (সিন) থেকে লাইন পাই এবং তারপরে আমরা পূর্ণসংখ্যাটি বের করি এই স্ট্রিং থেকে মানগুলি (পরিমাণ) টাইপের পরিবর্তে পরিবর্তিত হয় ""

আমার ধারণা ছিল যে ফাংশনটি একটি স্ট্রিংয়ের অবিচ্ছেদ্য অংশ গ্রহণ করবে এবং এটি ইনপুট হিসাবে ব্যবহার করবে।

(আমি এখানে ঠিক কীভাবে প্রশ্ন জিজ্ঞাসা করতে পারি তা আমি জানি না programming আমি প্রোগ্রামিংয়েও নতুন) ধন্যবাদ আপনাকে।


18
এই উদাহরণটি দয়ালু অদ্ভুত, আমি কখনও দেখিনি stringstreamused আমি সাধারণত, লাইন লোড বলা যায় এর রূপান্তরের এবং তারপর, অংশ দ্বারা নিষ্কাশন যাইহোক, এই স্পষ্টত সামান্য সুবিধা এখানে রয়েছে কারণ cin হল একটি ইনপুট স্ট্রিম ইতিমধ্যে ... সুতরাং cin >> price >> quantity;পর্যন্ত সহজ দ্বারা হবে। এটি cplusplus.com টিউটোরিয়াল না ব্যবহার করার ভাল কারণ হবে
বারটেক বানাচেউইচজ

6
মজার বিষয় এই টিউটোরিয়ালটি আমার প্রথম সি ++ তে প্রকাশ ছিল। দৃষ্টিশক্তি, এটি বেশ দরিদ্র এবং অসম্পূর্ণ। আমি এর পরিবর্তে একটি ভাল বইয়ের পরামর্শ দেব ।
jrok

@ বার্তেকবানাচিউইচজ সম্ভবত তাদের কীভাবে stringstreamকাজ করে তা দেখানোর জন্য উদাহরণ হাজির করা প্রয়োজন । এটি উদ্ভট একটি সম্ভবত খুব খারাপ =) তবে এটি আপনাকে স্ট্রিম হিসাবে স্ট্রিং হিসাবে আচরণ করতে পারে তা দেখায়।
luk32

যদি এটির আরও উন্নত ব্যবহারগুলির পরিচয় না হয় stringstreamতবে এটি অবশ্যই একটি ভুল উদাহরণ। এবং তা হলেও এটি অন্যভাবে লেখা উচিত।
j_kubik

1
@ ট্রজানসডেস্ট্রয় আপনি যে আদিম ভিত্তিক ভিত্তিক সমস্ত আদিমতা বোঝেন সেগুলি ছাড়াই আপনি স্ট্রিং স্ট্রিম বুঝতে পারবেন না, সুতরাং কোনও টিউটোরিয়াল পড়া কীভাবে সেই ক্ষেত্রে সহায়তা করে তা আমি দেখতে পাচ্ছি না।
বারটেক বানাচেউইচজ

উত্তর:


163

কখনও কখনও স্ট্রিংস্ট্রিম ব্যবহার করে স্ট্রিং স্ট্রিং এবং অন্যান্য সংখ্যার ধরণের মধ্যে রূপান্তর করতে খুব সুবিধাজনক। এর ব্যবহারের ব্যবহারের 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 কম বেশি একই ব্যবহার হয়।

সংক্ষেপে বলতে গেলে স্ট্রিং স্ট্রিমটি স্বতন্ত্র আই / ও ডিভাইসের মতো স্ট্রিংগুলি ম্যানিপুলেট করার একটি সুবিধাজনক উপায় ।

এফওয়াইআই, ক্লাসগুলির মধ্যে উত্তরাধিকারের সম্পর্কগুলি হ'ল:

স্ট্রিং স্ট্রিম ক্লাস


19

প্রশ্নের উত্তর দিতে। stringstreamমূলত আপনাকে কোনও stringঅবজেক্টের মতো আচরণ করার অনুমতি দেয় streamএবং এতে সমস্ত streamফাংশন এবং অপারেটর ব্যবহার করে।

আমি দেখেছি এটি মূলত ফর্ম্যাট আউটপুট / ইনপুট মঙ্গলতার জন্য ব্যবহৃত হয়েছে।

একটি ভাল উদাহরণ c++হ'ল স্ট্রিম অবজেক্টে নম্বর রূপান্তরকরণের বাস্তবায়ন।

সম্ভাব্য উদাহরণ:

template <class T>
string num2str(const T& num, unsigned int prec = 12) {
    string ret;
    stringstream ss;
    ios_base::fmtflags ff = ss.flags();
    ff |= ios_base::floatfield;
    ff |= ios_base::fixed;
    ss.flags(ff);
    ss.precision(prec);
    ss << num;
    ret = ss.str();
    return ret;
};

এটি কিছুটা জটিল তবে এটি বেশ জটিল। আপনি stringstreamঅবজেক্ট তৈরি করুন ss, এর পতাকাগুলি সংশোধন করুন, এর সাথে একটি নম্বর রাখুন এবং এর operator<<মাধ্যমে এটি বের করুন str()। আমার ধারণা এটি operator>>ব্যবহার করা যেতে পারে।

এছাড়াও এই উদাহরণে stringবাফারটি গোপন থাকে এবং স্পষ্টভাবে ব্যবহৃত হয় না। তবে প্রতিটি সম্ভাব্য দিক এবং ব্যবহারের ক্ষেত্রে লিখতে এটি কোনও পোস্টের পক্ষে অনেক দীর্ঘ হবে।

দ্রষ্টব্য: আমি সম্ভবত এটি এসওর কারও কাছ থেকে চুরি করেছি এবং সংশোধন করেছি, তবে আমার কাছে মূল লেখক উল্লেখ নেই।


3
দ্রষ্টব্য: এর ব্যবহার retঅপ্রয়োজনীয়, একটি লিখতে পারে return ss.str();
ম্যাথিউ এম।

@MatthieuM। আমার মনে হয় আরভিও কিক-ইন করবে কিনা আমি নিশ্চিত নই যদি এটি লেখা হয়, বা যদি ss.str () দ্বারা প্রত্যাবর্তিত বস্তুটি প্রস্থান পয়েন্ট থেকে বেঁচে থাকবে। এইভাবে আমি জানি আমি একটি অনুলিপি তৈরি করছি, এবং আরভিও কাজ করবে। তবে আপনি সম্ভবত সঠিক।
luk32

আসলে, আরভিওর 2 টি রূপ রয়েছে: ইউআরভিও (নামবিহীন, এটি অস্থায়ী) এবং এনআরভিও (নাম অনুসারে); বেশিরভাগ সংকলক আরভিও বাস্তবায়ন করে তবে কিছু এটি কেবল ইউআরভিও (বিল্ড বিকল্পগুলির উপর নির্ভর করে) এর মধ্যে সীমাবদ্ধ করে। সাধারণভাবে, যদিও আমলে নেওয়ার মতো প্রচুর অন্যান্য কারণ রয়েছে, তাই আপনার কেবলমাত্র সবচেয়ে পরিষ্কার কোডটি লিখতে হবে এবং আরভিও কিক করবে কিনা তা নিয়ে খুব বেশি চিন্তা করবেন না
এম।

এনআরভিও সাধারণ (যেমন ইউআরভিও) তবে এটি সরানো কনস্ট্রাক্টরের কারণে এটি একটি নন-ইস্যু।
Rapptz

18

থেকে সি ++ প্রাইমার :

Istringstream ধরনের একটি সার্চ স্ট্রিং , ostringstream একটি লিখেছেন স্ট্রিং এবং stringstream পড়ে এবং লিখেছেন স্ট্রিং

আমি এমন কিছু ক্ষেত্রে এসেছি যেখানে স্ট্রিংস্ট্রিম ব্যবহার করা সুবিধাজনক এবং সংক্ষিপ্ত উভয়ই ।

মামলা 1

এটি এই লেটকোড সমস্যার অন্যতম সমাধান থেকে এসেছে । এটি স্ট্রিং স্ট্রিমের ব্যবহার দক্ষ এবং সংক্ষিপ্ত যেখানে খুব উপযুক্ত কেসটি প্রদর্শন করে

ধরুন 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; 
 }

স্ট্রিংস্ট্রিম ব্যবহার না করে এ জাতীয় সংক্ষিপ্ত কোড লেখা কঠিন হবে।


2

আপনি একটি আলফানিউমারিক এবং ইনট, ফাঁকা সীমামৃত প্রবেশ করেছেন mystr

তারপরে আপনি প্রথম টোকেনকে (ফাঁকা বিস্মৃত) একটিতে রূপান্তরিত করার চেষ্টা করেছিলেন int

প্রথম টোকেনটি আরএস ছিল যা রূপান্তর করতে ব্যর্থ হয়েছিল int, মাইপ্রিসের জন্য একটি শূন্য রেখেছিল এবং আমরা সকলেই জানি যে কোনও কিছুর শূন্য গুণ আসে।

আপনি যখন দ্বিতীয় বার কেবলমাত্র মানগুলি প্রবেশ করেছিলেন, সমস্ত কিছু আপনার প্রত্যাশা অনুযায়ী কাজ করেছিল।

এটি উদ্দীপক আরএস ছিল যা আপনার কোডটিকে ব্যর্থ করেছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.