Saya ingin membersihkan dan menggunakan kembali ostringstream (dan buffer yang mendasarinya) sehingga aplikasi saya tidak perlu melakukan banyak alokasi. Bagaimana cara mereset objek ke keadaan awalnya?
c++
stl
reset
ostringstream
twk
sumber
sumber
Jawaban:
Saya telah menggunakan urutan clear dan str di masa lalu:
Yang telah melakukan hal untuk arus string input dan output. Atau, Anda dapat menghapus secara manual, lalu mencari urutan yang sesuai untuk memulai:
Itu akan mencegah beberapa realokasi dilakukan
str
dengan menimpa apa pun yang ada di buffer keluaran saat ini. Hasilnya seperti ini:Jika Anda ingin menggunakan string untuk fungsi-c, Anda dapat menggunakan
std::ends
, meletakkan penghentian null seperti ini:std::ends
adalah relik dari deprecatedstd::strstream
, yang bisa menulis langsung ke array karakter yang Anda alokasikan di stack. Anda harus memasukkan null terminating secara manual. Namun,std::ends
tidak usang, saya rasa karena masih berguna seperti kasus di atas.sumber
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>"
dan jika saya menggunakan kembali dengan string panjang yang berbeda saya mendapatkan bit yang tersisas.seekp(0); s << std::ends; s.seekp(0);
Tampaknya
ostr.str("")
panggilan itu berhasil.sumber
Jika Anda akan menghapus buffer dengan cara yang akan membuatnya dihapus sebelum digunakan pertama kali, Anda harus menambahkan sesuatu ke buffer terlebih dahulu dengan MSVC.
sumber
clear
akan menyebabkan yangfailbit
menjadi set jika sungai kosong. Sementara hanya meneleponseekp
seharusnya hanya kembali jika tidak ada aliran.Kamu tidak. Gunakan dua aliran dengan nama berbeda untuk kejelasan dan biarkan kompiler pengoptimal mengetahui bahwa ia dapat menggunakan kembali yang lama.
sumber
ostringstream
(berdasarkan data yang dibaca) dan kemudian harus menulis string yang dibangun diostringstream
suatu tempat dari waktu ke waktu (misalnya setelah urutan karakter tertentu dibaca) dan mulai membangun string baru.