কীভাবে একটি অস্ট্রিং স্ট্রিম পুনরায় ব্যবহার করবেন?


117

আমি একটি অস্ট্রিংস্ট্রিম (এবং অন্তর্নিহিত বাফার) সাফ করে পুনরায় ব্যবহার করতে চাই যাতে আমার অ্যাপ্লিকেশনটিকে এত বেশি বরাদ্দ না করতে হয়। কীভাবে আমি বস্তুর প্রাথমিক অবস্থায় পুনরায় সেট করব?


উত্তর:


156

আমি অতীতে পরিষ্কার এবং স্ট্রের একটি ক্রম ব্যবহার করেছি:

// clear, because eof or other bits may be still set. 
s.clear();
s.str("");

যা ইনপুট এবং আউটপুট উভয় স্ট্রিম স্ট্রিমের জন্য কাজটি করেছে। বিকল্পভাবে, আপনি ম্যানুয়ালি সাফ করতে পারেন, তারপরে শুরুতে যথাযথ ক্রম সন্ধান করুন:

s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start

এটি strবর্তমানে পরিবর্তে আউটপুট বাফারে যা আছে তা ওভাররাইট করে কিছু পুনর্বিবেচনা রোধ করবে । ফলাফলগুলি এরকম:

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");

আপনি যদি সি-ফাংশনগুলির জন্য স্ট্রিংটি ব্যবহার করতে চান তবে আপনি এইভাবে std::endsএকটি টার্মিনেটিং নাল লাগিয়ে ব্যবহার করতে পারেন :

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);

std::endsঅবচিত হ'ল একটি প্রতীক std::strstream, যা আপনি স্ট্যাকের জন্য বরাদ্দ করা একটি চর অ্যারে সরাসরি লিখতে সক্ষম হয়েছিল। আপনাকে ম্যানুয়ালি একটি সমাপ্ত নাল inোকাতে হবে। তবে, std::endsঅবহেলিত নয়, আমি মনে করি কারণ এটি উপরের ক্ষেত্রে যেমন এখনও কার্যকর।


আমি অস্ট্রিমে s.str () ব্যবহার করার চেষ্টা করছি। আকারটি এলোমেলো করছে (আমি দেখতে পাচ্ছি প্রথম চরিত্রটি শূন্য তবে এটি আরও অনেক মুদ্রণ করে)। স্ট্রেন দৈর্ঘ্য ঠিক করার কোনও ভাল উপায় আছে কি? আমি s.str ()। c_str () ব্যবহার করছি; এটিএম এবং এটি দুর্দান্তভাবে কাজ করে

আসলে এমনকি এটি সঠিক নয়। আমি কেবল s.str("");পরিবর্তে করেছি। auto str = s.str(); auto cstr = str.c_str(); file << cstr; s.clear(); s.seekp(0); s << ends;

স্ট্যান্ড :: boost::any a = 1; std::ostringstream buffer; buffer << a << std::ends; EXPECT_EQ( buffer.str(), "any<(int)1>" ); TestUtilsTest.cpp:27: Failure Expected: buffer.str() Which is: "any<(int)1>\0" To be equal to: "any<(int)1>"
শেষটি

বিকল্পটি সত্যিকারের উত্তর যদি আপনি পুনরায় স্থান এড়াতে চান। এবং আপনি যদি পুনঃনির্ধারণ ছাড়াই সত্যই "নতুন করে শুরু করতে" চান তবে কেবল স্ট্যান্ড :: শেষ প্রেরণের পরে আবার সিকপ (0) কল করুন। s.seekp(0); s << std::ends; s.seekp(0);
চিপ গ্র্যান্ডিটস

5

মনে হচ্ছে ostr.str("")কলটি কৌশলটি করে does


9
উল্লেখযোগ্য যে এটি অস্ট্রিংস্ট্রিম থেকে অন্তর্নিহিত বাফারটিকে আর ব্যবহার করবে না - এটি কেবলমাত্র একটি নতুন বাফার বরাদ্দ করে। সুতরাং আপনি যখন অস্ট্রিংস্ট্রিম অবজেক্টটি পুনরায় ব্যবহার করছেন, আপনি এখনও দুটি বাফার বরাদ্দ করছেন। আমি মনে করি না যে অস্ট্রিংস্ট্রিম আপনার ইচ্ছা মতো পুনরায় ব্যবহারের জন্য ডিজাইন করা হয়েছে।
রাজ্জলেব

2
এটি রাষ্ট্রকেও পরিষ্কার করে না, যা পরিষ্কার। () কী করে। আমি সম্মতি জানাই, এটি আসলে এই জাতীয় ব্যবহারের জন্য নয়। নিশ্চিত হওয়ার জন্য একটি নতুন তৈরি করুন। আপনি প্রোফাইল তৈরি করলেই আপনি এটির কোনও তাত্পর্যপূর্ণ কিনা তা খুঁজে পাবেন।
ব্রায়ান নীল

1
স্যাগ্রিভ, ব্রায়ান, ঠিক আছে। নোট করুন, তবে উপরে লিটব পদ্ধতিটি কীভাবে std :: এর ব্যবহারের প্রয়োজন। এটি বাফারটিকে পুনরায় ব্যবহার করে, তবে স্ট্রিংস্ট্রিমগুলির সাথে আপনাকে যথারীতি আলাদাভাবে কোড তৈরি করে (সাধারণত আপনি এসটিডি :: শেষ ব্যবহার করেন না)।
দিয়েগো সেভিলা

2

আপনি যদি বাফারটিকে এমনভাবে সাফ করতে যাচ্ছেন যা এটির প্রথম ব্যবহারের আগেই এটি পরিষ্কার হয়ে যায়, আপনাকে প্রথমে ডাব্লু / এমএসভিসি বাফারে কিছু যুক্ত করতে হবে।

struct Foo {
    std::ostringstream d_str;
    Foo() { 
        d_str << std::ends;   // Add this
    }
    void StrFunc(const char *);
    template<class T>
    inline void StrIt(const T &value) {
        d_str.clear();
        d_str.seekp(0);  // Or else you'll get an error with this seek
        d_str << value << std::ends;
        StrFunc(d_str.str().c_str());  // And your string will be empty
    }
};

আমি ভিএস ২০১২ এ ব্যর্থ আচরণটি দেখছি না। তদ্ব্যতীত, কলিং clearহবে কারণfailbit সেট হওয়ার যদি স্ট্রীম খালি। seekpস্রোতের অস্তিত্ব না থাকলে কেবল কল করার সময় কেবল ফিরে আসা উচিত।
জোনাথন মে

0

আপনি না। স্বচ্ছতার জন্য দুটি ভিন্ন ভিন্ন নামযুক্ত স্ট্রিম ব্যবহার করুন এবং অনুকূলিতকরণ সংকলকটি এটি পুরানোটিকে পুনরায় ব্যবহার করতে পারে তা নির্ধারণ করুন।


4
ব্যবহারের ক্ষেত্রে বিবেচনা করুন যেখানে কোডটি ইনপুট ডেটার উপর লুপ করছে, একটিতে লিখিত হয়েছে ostringstream(পড়ার উপাত্তের উপর ভিত্তি করে) এবং তারপরে ostringstreamকোথাও কোথাও নির্মিত স্ট্রিংটি সময়ে সময়ে লিখতে হবে (যেমন একটি নির্দিষ্ট অক্ষরের ক্রম পড়ার পরে) এবং শুরু করুন একটি নতুন স্ট্রিং নির্মাণ।
আন্দ্রে হল্জনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.