আপনি কীভাবে স্ট্রিংস্ট্রিম ভেরিয়েবল সাফ করবেন?


486

আমি ইতিমধ্যে বেশ কয়েকটি জিনিস চেষ্টা করেছি,

std::stringstream m;
m.empty();
m.clear();

উভয় কাজ করে না।

উত্তর:


771

সমস্ত স্ট্যান্ডার্ড লাইব্রেরির ধরণের জন্য সদস্য ফাংশনটি empty()কোয়েরি, কোনও আদেশ নয়, এর অর্থ "আপনি কি খালি?" "দয়া করে আপনার সামগ্রীগুলি ফেলে দিন"।

clear()সদস্য ফাংশন থেকে উত্তরাধিকারসূত্রে হয় iosএবং যদি একটি ফাইল প্রবাহে ত্রুটি রাষ্ট্র সেট আছে স্ট্রিম, যেমন ত্রুটির রাষ্ট্র পরিষ্কার করতে ব্যবহার করা হয় eofbit(শেষ অফ ফাইল), তারপর কলিং clear()ত্রুটির রাষ্ট্র ফিরে সেট হবে goodbit(কোন ত্রুটি) ।

ক এর বিষয়বস্তু সাফ করার জন্য stringstream:

m.str("");

সঠিক, যদিও ব্যবহার:

m.str(std::string());

টেকনিক্যালি আরও দক্ষ, কারণ আপনি std::stringযে কনস্ট্রাক্টর লাগে সেটাই আপনি এড়িয়ে চলেন const char*। তবে আজকাল যে কোনও সংকলক উভয় ক্ষেত্রেই একই কোড উত্পন্ন করতে সক্ষম হওয়া উচিত - তাই আমি কেবল আরও বেশি পাঠযোগ্য with


105
আপনি "ক্লিয়ার ()" অংশটি ভুলে গেলে যা ঘটে তা এখানে। stackoverflow.com/q/2848087/635549
galath

8
@ ক্ষিতিজবাণার্জি আমি সি ++ মি.স্ট্রি () এবং এম.এস.টি ("") তে ভাবি যে দুটি আলাদা ফাংশন। m.str () এমন একটি ফাংশন আহ্বান করে যা কোনও প্যারামিটারের প্রত্যাশা করে না যদিও m.str ("") এমন ফাংশনটি আহ্বান করবে যা কনস্টের চর * পরামিতি গ্রহণ করে। m.str () সম্ভবত একটি get ফাংশন হিসাবে প্রয়োগ করা হয়েছে যা স্ট্রিংটি ফিরিয়ে দেয় যেখানে m.str ("") একটি সেট ফাংশন হিসাবে প্রয়োগ করা হতে পারে ।
দিনেশ পিআর

4
যেমন গ্যালাথ বলেছেন যে এম.সি.ক্রিয়র () যুক্ত করাও অত্যন্ত গুরুত্বপূর্ণ; m.str ("") ছাড়াও; অন্যথায় আপনি সমস্যাগুলি পেতে পারেন যদি আপনি কোনও পর্যায়ে একটি খালি স্ট্রিং দিয়ে স্ট্রিংস্ট্রিমটি পূরণ করেন।
স্পুটনিক

1
@ অ্যানথ্রপড হ্যাঁ এটি গত বছর ছিল। আমি তখন থেকে এটি কাজ করে চলেছি।
জেমস

1
ওহ ছেলে এই স্বজ্ঞাত। সি ++ এর মতো অন্য সমস্ত কিছুর মতো!
রোদ চাঁদ

47

আপনি ত্রুটির অবস্থা সাফ করতে পারেন এবং স্ট্রিংস্ট্রিমটি সমস্ত এক লাইনে খালি করতে পারেন

std::stringstream().swap(m); // swap m with a default constructed stringstream

এটি কার্যকরভাবে একটি ডিফল্ট নির্মিত অবস্থায় পুনরায় সেট করে


3
এখানে অন্যান্য সমস্ত উত্তরের তুলনায় এটি করার সবচেয়ে কার্যকর এবং সর্বাধিক মার্জিত উপায়। তবে, স্টাডি :: স্ট্রিংস্ট্রিম :: অদলবদল একটি সি ++ 11 বৈশিষ্ট্য এবং এই সমাধানটি পূর্ববর্তী সি ++ 11 সংকলকগুলির জন্য কাজ করে না।
101010

4
বৈশিষ্ট্যটি এখনও গনুহ অনুপস্থিত ছ ++, v4.8 দেখুন stackoverflow.com/questions/24429441/...
জোয়াকিম ডব্লিউ

7
@ 101010: কীভাবে মুভ-অ্যাসাইনমেন্টের চেয়ে ভাল অদলবদল করা যায়?
Deduplicator

2
@ অ্যাসেটডি: এমনকি যদি তা অযোগ্য হয়, আপনি কি ডিফল্ট-নির্মিত-অস্থায়ী ভুলে গেছেন?
উত্সাহক

3
এটি কম কার্যকর। যখন আমি মূল এসএস ব্যবহার করতে চাই। এটি আমার জন্য একটি ফাঁকা স্থান বদল করে।
ঝাং


33

সংকলক নির্বিশেষে এটি সবচেয়ে নির্ভরযোগ্য উপায় হওয়া উচিত:

m=std::stringstream();

2
এটি আমার মতে আরও ভাল কারণ m.str (""); আমার স্ট্রিং স্ট্রিমের ফলে আমি যা কিছু চেষ্টা করেছিলাম সেই ফাঁকা মানটির সাথে আটকে গেল। তবে এটি ব্যবহার করে আমার সমস্যা নেই
জিলেটাইন 1

3
আমি একই সমস্যায় পড়েছিলাম, আমার mm.clear(); mm.str("");জন্য কৌশলটি করেছিলেন did (কোনও সি ++ 11 নেই, অন্যথায় অদলবদল আরও ভাল হবে)।
hochl

1
@ হচল: swapমুভ-অ্যাসাইনমেন্টের চেয়ে কেন ভাল হবে ?
ডিসিপ্লিকেটর

4
এটা সব পরিস্থিতিতে ভাল না। এটি প্রতিবার বাফারকে পুনরায় বরাদ্দ করবে যখন মিমি।
শীতল শাহ

3
স্ট্রিং স্ট্রিম অবজেক্টটি ফ্লাশ করার জন্য আমার প্রাথমিক ব্যবহারের ক্ষেত্রে স্ট্রিং স্ট্রিমের অভাবনীয় তাত্ক্ষণিকতা রোধ করার জন্য একটি থ্রেডলোকাল স্ট্রিংস্ট্রোম অবজেক্টকে চারপাশে রাখছে - একটি নতুন স্ট্রিমস্ট্রিম অবজেক্ট গ্লোবাল লোকেল অবজেক্ট অনুলিপি করে - তাত্ত্বিকভাবে এটি দ্রুত এবং কেবলমাত্র একটি পারমাণবিক বৃদ্ধিতে জড়িত, তবে একমত হওয়ার স্তরে আমি প্রায়শই পঙ্গু হয়ে পড়ি।
স্পেসমুজ

12

আমি সর্বদা এটি স্কোপ করছি:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

এটি পরিষ্কার করার চেয়েstringstream?
রবুর_131

11

আমার 2 সেন্ট:

এটি আমার জন্য এক্সকোড এবং দেব-সি ++ এ কাজ করেছিল বলে মনে হয়েছিল, আমার একটি মেনু আকারে একটি প্রোগ্রাম ছিল যে কোনও ব্যবহারকারীর অনুরোধ অনুসারে যদি পুনরাবৃত্তভাবে কার্যকর করা হয় তবে একটি স্ট্রিংস্ট্রিম ভেরিয়েবল পূরণ করবে যা প্রথমবারের মতো ঠিকঠাক কাজ করবে would চালান তবে পরের বার ব্যবহারকারী একই কোড চালাবেন স্ট্রিংস্ট্রিমটি সাফ করবেন না। তবে নীচের দুটি লাইনের কোডটি শেষ পর্যন্ত স্ট্রিং ভেরিয়েবলটি পূরণ করার আগে স্ট্রিংস্ট্রিম ভেরিয়েবলটি সাফ করে দিয়েছে। (2 ঘন্টা ট্রায়াল এবং ত্রুটি এবং গুগল অনুসন্ধানগুলি), বিটিডব্লিউ, প্রতিটি লাইন তাদের নিজেরাই ব্যবহার করে কৌশলটি চালায় না।

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";

-1

এটি একটি ধারণাগত সমস্যা।

স্ট্রিং স্ট্রিম একটি স্ট্রিম, সুতরাং এর পুনরুক্তিকারীরা এগিয়ে থাকে, ফিরে আসতে পারে না। একটি আউটপুট স্ট্রিং স্ট্রিমে, আপনার অন্য কোনও আউটপুট স্ট্রিমের মতো এটি পুনরায় পুনর্নির্মাণের জন্য আপনার একটি ফ্লাশ () প্রয়োজন।


1
en.cppreferences.com/w/cpp/io/basic_ostream/flush ফ্লাশ এটি সম্পর্কিত স্টোরেজ ডিভাইসের সাথে সিঙ্ক্রোনাইজ করে। এটি একই পুনর্নির্মাণ নয়।
ক্লিয়ারার

-11

এগুলি gnu c ++ এ স্ট্রিং স্ট্রিমে ডেটা ফেলে দেয় না

    m.str("");
    m.str() = "";
    m.str(std::string());

নিম্নলিখিতটি আমার জন্য স্ট্রিংস্ট্রিমটি খালি করে:

    m.str().clear();

7
আমি এতটা নিশ্চিত নই যে এটি কাজ করবে, কারণ একই কারণে বার্নহারড্রুস কাজ করবে না। .Str () ফাংশনটি একটি অনুলিপি প্রদান করে, এবং অনুলিপি সাফ করা কিছু করবে না।
ভার্ডাগন

1
এই সমাধানটি মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ এর জন্য কাজ করে না।
জাক

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