जवाबों:
मैंने अतीत में स्पष्ट और स्पष्ट क्रम का उपयोग किया है:
// 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
, जो स्टैक पर आपको आवंटित एक चार सरणी में सीधे लिखने में सक्षम था। आपको मैन्युअल रूप से एक समाप्ति नल सम्मिलित करना था। हालांकि, std::ends
पदावनत नहीं किया गया है, मुझे लगता है कि क्योंकि यह अभी भी उपरोक्त मामलों में उपयोगी है।
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>"
और अगर मैं अलग-अलग लंबाई के तार के साथ पुन: उपयोग करता हूं तो मुझे बिट्स पर छोड़ दिया जाता है
s.seekp(0); s << std::ends; s.seekp(0);
ऐसा लगता है कि ostr.str("")
कॉल चाल करता है।
यदि आप बफर को इस तरह से साफ़ करने जा रहे हैं, जिससे यह पहली बार उपयोग होने से पहले ही साफ़ हो जाएगा, तो आपको पहले w / 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
}
};
clear
होगा कारणfailbit
सेट होने के लिए करता है, तो धारा खाली है। seekp
यदि कोई धारा मौजूद नहीं है तो बस कॉलिंग को वापस लौटना चाहिए।
तुम नहीं। स्पष्टता के लिए दो अलग-अलग नामित धाराओं का उपयोग करें और अनुकूलन संकलक को यह पता लगाने दें कि यह पुराने का पुन: उपयोग कर सकता है।
ostringstream
(डेटा रीड के आधार पर) को लिख रहा है और फिर ostringstream
समय-समय पर कहीं में निर्मित स्ट्रिंग को लिखना है (जैसे एक निश्चित चरित्र अनुक्रम पढ़ने के बाद) और शुरू एक नए तार का निर्माण।