Как вы очищаете переменную stringstream?

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

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

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

21.08.2008 18:35:57
8 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

m.str("");

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

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

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

763
3.09.2015 20:31:11
Вот что происходит, когда вы забываете часть «clear ()». stackoverflow.com/q/2848087/635549
galath 17.06.2012 19:17:34
@KshitijBanerjee Я думаю, что в C ++ m.str () и m.str ("") - две разные функции. m.str () вызывает функцию, которая не ожидала какого-либо параметра, тогда как m.str ("") вызывает функцию, которая принимает параметр const char *. m.str () мог быть реализован как функция get, которая возвращает строку, тогда как m.str ("") мог быть реализован как функция set .
Dinesh P.R. 18.07.2012 05:41:27
Как сказал Галат, очень важно также добавить m.clear (); в дополнение к m.str ("") ;. В противном случае вы можете получить проблемы, если в какой-то момент вы заполните поток строк пустой строкой.
Sputnik 20.10.2015 16:45:07
@anthropod Да, это было в прошлом году. С тех пор я получил это работает.
James 3.06.2018 19:08:02
О, мальчик, это интуитивно понятно. Как и все остальное в C ++!
sunny moon 29.11.2019 15:55:40
m.str("");

похоже на работу.

36
21.08.2008 18:36:18
Это будет очищено с помощью .clear (), который указан в OP.
Dave Lugg 13.05.2014 19:56:09

Они не отбрасывают данные в потоке строк в gnu c ++

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

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

    m.str().clear();
-11
6.09.2012 22:58:41
Я не уверен, что это сработает, по тем же причинам, по которым Бернхардруш не сработает. Функция .str () возвращает копию, и очистка копии ничего не сделает.
Verdagon 29.03.2013 21:22:00
Это решение НЕ работает для Microsoft Visual C ++.
Zak 21.02.2014 18:15:49
Неправильно. Clear будет работать со строкой, возвращаемой из потока, а не с самим потоком.
Joey Carson 30.04.2016 15:47:49

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

m=std::stringstream();
33
29.10.2012 17:15:18
На мой взгляд, это лучше, потому что m.str (""); заставил мой поток строк зависнуть с этим пустым значением, что бы я ни пытался. Но при использовании этого у меня нет этой проблемы
gelatine1 25.05.2014 06:59:39
Я столкнулся с той же проблемой, для меня mm.clear(); mm.str("");сделали свое дело. (нет C ++ 11, иначе обмен был бы лучше).
hochl 27.08.2015 11:42:28
@hochl: Почему это swapлучше, чем задание на переезд?
Deduplicator 2.12.2015 19:26:18
Это не хорошо для всех ситуаций. Это будет перераспределять буфер каждый раз, а mm.str ("") не будет.
Shital Shah 24.12.2016 01:29:39
Мой основной вариант использования для сброса объекта stringstream - это сохранение потокового объекта stringstream для предотвращения ненужного создания экземпляра stringstream - создание экземпляра нового объекта stringstream, копирующего объект глобального языкового стандарта - теоретически это происходит быстро и требует только увеличения атомарного значения, но на уровне параллелизма я имею дело с тем, что он часто наносит вред.
Spacemoose 17.11.2017 13:39:52

мои 2 цента:

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

//clear the stringstream variable

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

//fill up the streamstream variable
sstm << "crap" << "morecrap";
11
26.06.2018 13:07:00

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

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

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

{
    std::stringstream ss;
    ss << "heck";
}
12
5.06.2018 08:23:58

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

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

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

46
1.08.2019 09:39:41
Это самый эффективный и самый элегантный способ сделать это по сравнению со всеми другими ответами здесь. Однако std :: stringstream :: swap является функцией c ++ 11, и это решение не работает для предыдущих компиляторов c ++ 11.
101010 3.11.2014 09:48:31
Функция по- прежнему отсутствует в GNU г ++ v4.8 см stackoverflow.com/questions/24429441/...
Joachim W 11.11.2014 16:11:17
@ 101010: Как обмен лучше, чем перемещение?
Deduplicator 2.12.2015 19:27:07
@ AsetD: Даже если это не исключение, вы забыли временное построение по умолчанию?
Deduplicator 30.06.2017 14:00:54
Это малоэффективно. Когда я хочу повторно использовать оригинальные сс. Это меняет пустое место для меня.
Zhang 11.12.2018 05:23:37

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

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

-1
10.10.2014 20:04:50
ru.cppreference.com/w/cpp/io/basic_ostream/flush flush синхронизируется с устройством хранения, с которым он связан. Это не та же самая реинициализация.
Clearer 21.11.2014 11:09:07