Как очистить переменную строкового потока?

Я уже пробовал несколько вещей,

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

оба из них не работают.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
520
0
413 372
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

m.str("");

вроде работает.

Это будет очищено .clear (), который указан в OP.

Dave Lugg 13.05.2014 23:56
Ответ принят как подходящий

Для всех типов стандартных библиотек функция-член empty() является запросом, а не командой, то есть означает «вы пусты?» а не «выбросьте, пожалуйста, свое содержимое».

Функция-член clear() наследуется от ios и используется для очистки состояния ошибки потока, например если для файлового потока установлено состояние ошибки eofbit (конец файла), то вызов clear() вернет состояние ошибки в goodbit (без ошибки).

Для очистки содержимого stringstream, используя:

m.str("");

правильно, хотя с использованием:

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

технически более эффективен, поскольку вы избегаете вызова конструктора std::string, который принимает const char*. Но любой компилятор в наши дни должен иметь возможность генерировать один и тот же код в обоих случаях, поэтому я бы просто выбрал то, что более читабельно.

Вот что происходит, когда вы забываете о части «clear ()». stackoverflow.com/q/2848087/635549

galath 17.06.2012 23:17

почему m.str () возвращает строковые значения, но не очищает поток?

Kshitij Banerjee 05.07.2012 15:22

@KshitijBanerjee Я думаю, что в C++ m.str () и m.str ("") - это две разные функции. m.str () вызывает функцию, которая не ожидала никаких параметров, тогда как m.str ("") вызывает функцию, которая принимает параметр const char *. m.str () могла быть реализована как функция получать, которая возвращает строку, тогда как m.str ("") могла быть реализована как функция набор.

Dinesh P.R. 18.07.2012 09:41

Следующая ссылка аккуратно документирует обе версии str en.cppreference.com/w/cpp/io/basic_stringstream/str

wardw 17.09.2012 18:34

Как сказал galath, очень важно также добавить m.clear (); в дополнение к m.str ("") ;. В противном случае могут возникнуть проблемы, если в какой-то момент вы заполните поток строк пустой строкой.

Sputnik 20.10.2015 19:45

происходит что-то странное. После очистки строкового потока с помощью str ("") строковый поток не может быть установлен с дополнительными данными> пример: std :: stringstream ss; SS

James 22.05.2017 23:06

@ Джеймс, это действительно ваш полный контекст? Здесь ваш фрагмент работает должным образом: wandbox.org/permlink/PX6ISZbFNpaejfYW

arthropod 02.06.2018 21:48

@anthropod Да, это было в прошлом году. С тех пор я заработал.

James 03.06.2018 22:08

О боже, это интуитивно понятно. Как и все остальное в C++!

sunny moon 29.11.2019 18:55

Они не отбрасывают данные в строковом потоке в GNU C++

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

Следующее для меня очищает поток строк:

    m.str().clear();

Я не уверен, что это сработает, по тем же причинам, что и Bernhardrusch's. Функция .str () возвращает копию, и очистка копии ничего не даст.

Verdagon 30.03.2013 01:22

Это решение НЕ работает для Microsoft Visual C++.

Zak 21.02.2014 22:15

Неправильно. Clear будет работать со строкой, возвращаемой из потока, а не с самим потоком.

Joey Carson 30.04.2016 18:47

Это должен быть самый надежный способ независимо от компилятора:

m=std::stringstream();

На мой взгляд, это лучше, потому что m.str (""); заставил мой поток строк застрять с этим пустым значением, что бы я ни пробовал. Но с этим у меня нет такой проблемы

gelatine1 25.05.2014 10:59

Я столкнулся с той же проблемой, для меня mm.clear(); mm.str(""); помог. (нет C++ 11, иначе подкачка была бы лучше).

hochl 27.08.2015 14:42

@hochl: Почему swap лучше, чем перемещение-назначение?

Deduplicator 02.12.2015 22:26

Думаю, это тоже было бы хорошо. Если производительность важна, вы можете проверить, что быстрее, и выбрать соответствующий вариант.

hochl 04.12.2015 16:11

Почти наверняка самый быстрый и лучший ответ, но требует C++ 11.

Nemo 02.10.2016 01:04

Это не подходит для всех ситуаций. Это будет перераспределять буфер каждый раз, в то время как mm.str ("") - нет.

Shital Shah 24.12.2016 04:29

Мой основной вариант использования для очистки объекта строкового потока - это сохранение локального объекта строкового потока, чтобы предотвратить ненужное создание экземпляра строкового потока - создание экземпляра нового объекта строкового потока копирует глобальный объект локали - теоретически это быстро и требует только увеличения атомарного, но на уровне параллелизма, с которым я сталкиваюсь, это часто приводит к параличу.

Spacemoose 17.11.2017 16:39

use of deleted function ‘std::basic_stringstream<char>& std::basic_stringstream<char>::operator=(const std::basic_stringstream<char>&)

Rodrigo Gurgel 22.12.2017 16:44

мои 2 цента:

это, похоже, сработало для меня в xcode и dev-C++, у меня была программа в виде меню, которое при итеративном выполнении по запросу пользователя заполняет переменную строкового потока, которая будет работать нормально, когда код будет в первый раз run, но не очистит поток строк в следующий раз, когда пользователь запустит тот же код. но две строки кода ниже, наконец, очищали переменную строкового потока каждый раз перед заполнением строковой переменной. (2 часа проб и ошибок и поисков в Google), кстати, использование каждой строки отдельно не поможет.

//clear the stringstream variable

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

//fill up the streamstream variable
sstm << "crap" << "morecrap";

Я всегда смотрю на это:

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

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

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

Это лучше, чем очистить stringstream?

Robur_131 25.05.2020 13:06

Вы можете очистить состояние ошибки и очистить поток строк в одной строке

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

Это эффективно сбрасывает m в сконструированное состояние по умолчанию.

Это наиболее эффективный и элегантный способ сделать это по сравнению со всеми другими ответами здесь. Однако std :: stringstream :: swap - это функция C++ 11, и это решение не работает для предыдущих компиляторов C++ 11.

101010 03.11.2014 12:48

Функция все еще отсутствует в GNU g ++ v4.8, см. stackoverflow.com/questions/24429441/…

Joachim W 11.11.2014 19:11

@ 101010: Чем подкачка лучше, чем назначение перемещения?

Deduplicator 02.12.2015 22:27

@Deduplicator - подкачки нет кроме

Aset D 30.06.2017 16:55

@AsetD: Даже если это не исключение, вы забыли временную конструкцию, созданную по умолчанию?

Deduplicator 30.06.2017 17:00

Это малоэффективно. Когда я хочу повторно использовать исходный файл ss. Он меняет пустое место для меня.

Zhang 11.12.2018 08:23

@ 101010 Я ожидал, что это будет намного эффективнее меньше, чем вызов m.str({}), как сказано в комментарии Чжана. Чтобы уточнить: когда вы вызываете m.str({}), я ожидал, что он будет повторно использовать часть памяти, выделенной во время первой операции, для ускорения следующей операции. Когда вы вызываете std::stringstream().swap(m), я ожидаю, что права собственности на любую память, выделенную им во время первой операции, будут переданы только что созданному временному устройству, что приведет к потере шанса на такую ​​эффективность. Хотя было бы интересно увидеть сравнение на практике.

Arthur Tacca 05.03.2019 13:02

с таким же успехом можно просто сделать m = std::stringstream();, а не обмениваться данными с объектом, который вы удаляете

Puddle 31.05.2019 17:30

Я думаю, это вызывает утечку памяти, поскольку исходный адрес памяти m останется в памяти без разрушения. Конструкция stringstream() создает новый объект и меняет его местами на m.

shaheen g 19.11.2020 02:22

Я думаю, что swap - хорошее общее решение, потому что потоки могут иметь много внутреннего состояния. Что касается временных файлов, я ожидаю, что компилятор их устранит. А выделение чревато; избегайте предварительной оптимизации. Я ожидал, что распределение обычно будет возиться с указателем.

John H. 16.02.2021 19:51

Это концептуальная проблема.

Stringstream - это поток, поэтому его итераторы идут вперед и не могут вернуться. В выходном строковом потоке вам понадобится flush () для его повторной инициализации, как и в любом другом выходном потоке.

en.cppreference.com/w/cpp/io/basic_ostream/flush flush synchronizes with the storage device it's associated with. This is not the same reinitialization.
Clearer 21.11.2014 14:09

Другие вопросы по теме