Я вже спробував кілька речей,
std::stringstream m;
m.empty();
m.clear();
обидва вони не працюють.
Я вже спробував кілька речей,
std::stringstream m;
m.empty();
m.clear();
обидва вони не працюють.
Відповіді:
Для всіх стандартних типів бібліотеки функція-член empty()
- це запит, а не команда, тобто це означає, що "ви порожні?" не "просимо викидати вміст".
Функція- clear()
член успадковується від ios
і використовується для очищення стану помилки потоку, наприклад, якщо у файловому потоці встановлено стан помилки eofbit
(кінець файлу), тоді виклик clear()
поверне стан помилки доgoodbit
(немає помилки) .
Для очищення вмісту а stringstream
використовуйте:
m.str("");
є правильним, хоча використовує:
m.str(std::string());
технічно ефективніше, тому що ви уникаєте посилань на std::string
конструктор, який займає const char*
. Але будь-який компілятор в ці дні повинен мати можливість генерувати один і той же код в обох випадках - тому я б просто зайнявся тим, що можна прочитати.
Ви можете очистити стан помилки і виповнити потоковий рядок все в одному рядку
std::stringstream().swap(m); // swap m with a default constructed stringstream
Це ефективно скидає m до стан, побудованого за замовчуванням
Це має бути найнадійнішим способом незалежно від компілятора:
m=std::stringstream();
mm.clear(); mm.str("");
зробив трюк. (немає C ++ 11, інакше підміна буде краще).
swap
б краще, ніж переміщення-призначення?
мої 2 копійки:
це, здавалося, працює для мене в xcode та dev-c ++, у мене була програма у вигляді меню, яка, якщо вона виконується ітеративно відповідно до запиту користувача, заповнить змінну струну, яка буде працювати нормально, коли перший раз код буде запустити, але не очистить потоковий рядок наступного разу, коли користувач запустить той самий код. але два рядки коду нижче, нарешті, очищають змінну струну кожного разу перед заповненням змінної рядка. (2 години спроб та помилок та пошуку в Google), btw, використовуючи кожен рядок самостійно, не зробить цього.
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
Це концептуальна проблема.
Stringstream - це потік, тому його ітератори вперед, не можуть повернутися. У вихідному потоковому потоці вам потрібен flush () для його повторної ініціалізації, як і в будь-якому іншому потоці виводу.
Вони не відкидають дані у потоці рядків у gnu c ++
m.str("");
m.str() = "";
m.str(std::string());
Далі випорожнюється потоковий рядок для мене:
m.str().clear();