Yanıtlar:
Geçmişte bir dizi clear ve str kullandım:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
Hem girdi hem de çıktı dizesi akışları için bir şey yaptı. Alternatif olarak, manuel olarak temizleyebilir ve ardından başlamak için uygun sırayı arayabilirsiniz:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
Bu, str
halihazırda çıktı tamponunda bulunanların üzerine yazarak yapılan bazı yeniden tahsisleri önleyecektir . Sonuçlar şuna benzer:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
Dizeyi c işlevleri için kullanmak istiyorsanız, aşağıdaki std::ends
gibi sonlandırıcı bir boş koyarak kullanabilirsiniz :
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
yığıt üzerinde ayırdığınız bir char dizisine doğrudan yazabilen , kullanımdan kaldırılmış bir kalıntıdır . Manuel olarak bir sonlandırma boşluğu eklemeniz gerekiyordu. Ancak, std::ends
kullanımdan kaldırılmadı, çünkü yukarıdaki durumlarda olduğu gibi hala yararlı olduğunu düşünüyorum.
s.str("");
yerine ben yaptım . 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>"
ve farklı uzunluktaki dizelerle yeniden kullanırsam bitlerin üzerinde
s.seekp(0); s << std::ends; s.seekp(0);
Görünüşe göre ostr.str("")
arama hile yapıyor.
Arabelleği, ilk kullanımdan önce temizlenmesine neden olacak şekilde temizleyecekseniz, önce tampona w / MSVC ile bir şey eklemeniz gerekir.
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
olacaktır nedenfailbit
Akış boş olup olmadığını tespit eder. Sadece arama yapılırken, seekp
akış yoksa geri dönmelidir.
Yapmıyorsun. Netlik için iki farklı adlandırılmış akış kullanın ve optimize eden derleyicinin eskisini yeniden kullanabileceğini anlamasına izin verin.
ostringstream
(okunan verilere göre) ve daha sonra ostringstream
zaman zaman bir yere yerleşik dizgiyi yazması gerektiği (örneğin, belirli bir karakter dizisi okunduktan sonra) kullanım durumunu düşünün ve başlayın yeni bir ip oluşturmak.