Bagaimana Anda menghapus variabel stringstream?

486

Saya sudah mencoba beberapa hal,

std::stringstream m;
m.empty();
m.clear();

keduanya tidak bekerja.

CodingWithoutComments
sumber

Jawaban:

771

Untuk semua jenis pustaka standar, fungsi anggota empty()adalah kueri, bukan perintah, artinya ini berarti "Anda kosong?" bukan "tolong buang konten Anda".

Fungsi clear()anggota diwarisi dari iosdan digunakan untuk menghapus status kesalahan aliran, misalnya jika aliran file memiliki status kesalahan diatur ke eofbit(akhir file), maka panggilan clear()akan mengatur status kesalahan kembali ke goodbit(tidak ada kesalahan) .

Untuk menghapus konten a stringstream, gunakan:

m.str("");

benar, meskipun menggunakan:

m.str(std::string());

secara teknis lebih efisien, karena Anda menghindari memohon std::stringkonstruktor yang mengambil const char*. Tetapi setiap kompiler hari ini harus dapat menghasilkan kode yang sama dalam kedua kasus - jadi saya hanya akan pergi dengan apa pun yang lebih mudah dibaca.

Wilka
sumber
105
Inilah yang terjadi ketika Anda lupa bagian "clear ()". stackoverflow.com/q/2848087/635549
galath
8
@ KshitijBanerjee Saya pikir di C ++ m.str () dan m.str ("") adalah dua fungsi yang berbeda. m.str () memanggil fungsi yang tidak mengharapkan parameter apa pun sedangkan m.str ("") akan memanggil fungsi yang menerima parameter const char *. m.str () mungkin telah diimplementasikan sebagai fungsi get yang mengembalikan string sedangkan m.str ("") mungkin telah diimplementasikan sebagai fungsi set .
Dinesh PR
4
Seperti kata galath, sangat penting juga untuk menambahkan m.clear (); selain m.str ("") ;. Kalau tidak, Anda bisa mendapatkan masalah jika pada suatu saat Anda mengisi stringstream dengan string kosong.
Sputnik
1
@anthropod Ya itu tahun lalu. Sejak itu saya membuatnya bekerja.
James
1
Ya ampun ini intuitif. Sama seperti hal lain tentang C ++!
bulan cerah
47

Anda dapat menghapus status kesalahan dan mengosongkan stringstream semua dalam satu baris

std::stringstream().swap(m); // swap m with a default constructed stringstream

Ini secara efektif me-reset m ke keadaan dibangun standar

Nikos Athanasiou
sumber
3
Ini adalah cara paling efisien dan paling elegan untuk melakukannya dibandingkan dengan semua jawaban lain di sini. Namun, std :: stringstream :: swap adalah fitur c ++ 11 dan solusi ini tidak berfungsi untuk kompiler c ++ 11 sebelumnya.
101010
4
Fitur yang masih belum ada di GNU g ++ v4.8, lihat stackoverflow.com/questions/24429441/…
Joachim W
7
@ 101010: Bagaimana menukar lebih baik daripada memindahkan tugas?
Deduplicator
2
@AsetD: Bahkan jika itu bukan kecuali, apakah Anda lupa sementara dibangun secara default?
Deduplicator
3
Ini efisien rendah. Ketika saya ingin kembali menggunakan ss asli. Swaps kosong untuk saya.
Zhang
36
m.str("");

sepertinya berhasil.

CodingWithoutComments
sumber
3
Itu akan dihapus oleh .clear () yang ditentukan dalam OP.
Dave Lugg
33

Ini harus menjadi cara yang paling dapat diandalkan terlepas dari kompiler:

m=std::stringstream();
Jerron
sumber
2
Ini lebih baik menurut saya karena m.str (""); menyebabkan stringstream saya terjebak dengan nilai kosong apa pun yang saya coba. Tetapi menggunakan ini saya tidak punya masalah itu
gelatine1
3
Saya mengalami masalah yang sama, untuk saya mm.clear(); mm.str("");melakukan trik. (tanpa C ++ 11, kalau tidak swap akan lebih baik).
hochl
1
@ Hochl: Mengapa swaplebih baik daripada memindahkan tugas?
Deduplicator
4
Ini tidak baik untuk semua situasi. Ini akan mengalokasikan kembali buffer setiap kali sementara mm.str ("") tidak.
Shital Shah
3
Kasus penggunaan utama saya untuk menyiram objek stringstream adalah menjaga agar objek stringstream threadlocal tetap di sekitar untuk mencegah instantiasi stringstream yang tidak perlu - instantiasi objek stringstream baru menyalin objek lokal global - secara teoritis ini cepat dan hanya melibatkan penambahan atom, tetapi pada tingkat konkurensi saya berurusan dengan itu sering melumpuhkan.
Spacemoose
12

Saya selalu melakukan pelingkupan:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}
Timok
sumber
1
Apakah ini lebih baik daripada menghapusstringstream?
Robur_131
11

2 sen saya:

ini tampaknya bekerja untuk saya di xcode dan dev-c ++, saya punya program dalam bentuk menu yang jika dieksekusi secara iteratif sesuai permintaan pengguna akan mengisi variabel stringstream yang akan bekerja ok saat pertama kali kode akan jalankan tetapi tidak akan menghapus stringstream saat pengguna akan menjalankan kode yang sama. tetapi dua baris kode di bawah ini akhirnya membersihkan variabel stringstream setiap kali sebelum mengisi variabel string. (2 jam percobaan dan kesalahan dan pencarian google), btw, menggunakan setiap baris sendiri tidak akan melakukan trik.

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";
Francisco Cortes
sumber
-1

Ini masalah konseptual.

Stringstream adalah aliran, jadi iteratornya maju, tidak bisa kembali. Dalam aliran string keluaran, Anda memerlukan flush () untuk menginisialisasi ulang, seperti pada aliran output lainnya.

Alcino Dall Igna Junior
sumber
2
en.cppreference.com/w/cpp/io/basic_ostream/ flush menyinkronkan dengan perangkat penyimpanan yang dikaitkan dengannya. Ini bukan inisialisasi ulang yang sama.
jelas
-12

Ini tidak membuang data dalam stringstream di gnu c ++

    m.str("");
    m.str() = "";
    m.str(std::string());

Berikut ini tidak mengosongkan stringstream untuk saya:

    m.str().clear();
John
sumber
7
Saya tidak begitu yakin ini akan berhasil, karena alasan yang sama bernhardrusch tidak akan berhasil. Fungsi .str () mengembalikan salinan, dan menghapus salinan tidak akan melakukan apa pun.
Verdagon
1
Solusi ini TIDAK berfungsi untuk Microsoft Visual C ++.
Zak
Salah. Clear akan beroperasi pada string yang dikembalikan dari aliran, bukan aliran itu sendiri.
Joey Carson