سؤال

وأود أن مسح خارج وإعادة استخدام ostringstream (والمخزن المؤقت الأساسي) بحيث لا يكون التطبيق جهدي للقيام العديد من المخصصات. كيف أقوم بإعادة ضبط الكائن إلى حالته الأولية؟

هل كانت مفيدة؟

المحلول

ولقد استعملت تسلسل واضح وشارع في الماضي:

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

ما فعلت الشيء لكل من المدخلات والمخرجات stringstreams. بدلا من ذلك، يمكنك اضح يدويا، ثم السعي للحصول على التسلسل المناسب للبدء:

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 إهمال، الذي كان قادرا على الكتابة مباشرة إلى مجموعة شار لك المخصصة على المكدس. كان عليك أن إدراج فارغة تنتهي يدويا. ومع ذلك، لا يتم إهمال std::ends، وأعتقد أنه لا يزال من المفيد كما في الحالات المذكورة أعلاه.

نصائح أخرى

ويبدو أن تلك الدعوة ostr.str("") لا حيلة.

إذا كنت تريد الذهاب لمسح المخزن المؤقت بطريقة من شأنها أن تتسبب في إزالتها قبل انها أول استخدام، سوف تحتاج إلى إضافة شيء إلى المخزن المؤقت أولا ث / MSVC.

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

وأنت لا تفعل ذلك. استخدام اثنين من تيارات مسمى بشكل مختلف عن الوضوح والسماح للشخصية المترجم الأمثل إلى أنه يمكن إعادة استخدام واحدة من العمر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top