Я уже пробовал несколько вещей,
std::stringstream m;
m.empty();
m.clear();
оба из них не работают.





m.str("");
вроде работает.
Для всех типов стандартных библиотек функция-член empty() является запросом, а не командой, то есть означает «вы пусты?» а не «выбросьте, пожалуйста, свое содержимое».
Функция-член clear() наследуется от ios и используется для очистки состояния ошибки потока, например если для файлового потока установлено состояние ошибки eofbit (конец файла), то вызов clear() вернет состояние ошибки в goodbit (без ошибки).
Для очистки содержимого stringstream, используя:
m.str("");
правильно, хотя с использованием:
m.str(std::string());
технически более эффективен, поскольку вы избегаете вызова конструктора std::string, который принимает const char*. Но любой компилятор в наши дни должен иметь возможность генерировать один и тот же код в обоих случаях, поэтому я бы просто выбрал то, что более читабельно.
Вот что происходит, когда вы забываете о части «clear ()». stackoverflow.com/q/2848087/635549
почему m.str () возвращает строковые значения, но не очищает поток?
@KshitijBanerjee Я думаю, что в C++ m.str () и m.str ("") - это две разные функции. m.str () вызывает функцию, которая не ожидала никаких параметров, тогда как m.str ("") вызывает функцию, которая принимает параметр const char *. m.str () могла быть реализована как функция получать, которая возвращает строку, тогда как m.str ("") могла быть реализована как функция набор.
Следующая ссылка аккуратно документирует обе версии str en.cppreference.com/w/cpp/io/basic_stringstream/str
Как сказал galath, очень важно также добавить m.clear (); в дополнение к m.str ("") ;. В противном случае могут возникнуть проблемы, если в какой-то момент вы заполните поток строк пустой строкой.
происходит что-то странное. После очистки строкового потока с помощью str ("") строковый поток не может быть установлен с дополнительными данными> пример: std :: stringstream ss; SS
@ Джеймс, это действительно ваш полный контекст? Здесь ваш фрагмент работает должным образом: wandbox.org/permlink/PX6ISZbFNpaejfYW
@anthropod Да, это было в прошлом году. С тех пор я заработал.
О боже, это интуитивно понятно. Как и все остальное в C++!
Они не отбрасывают данные в строковом потоке в GNU C++
m.str("");
m.str() = "";
m.str(std::string());
Следующее для меня очищает поток строк:
m.str().clear();
Я не уверен, что это сработает, по тем же причинам, что и Bernhardrusch's. Функция .str () возвращает копию, и очистка копии ничего не даст.
Это решение НЕ работает для Microsoft Visual C++.
Неправильно. Clear будет работать со строкой, возвращаемой из потока, а не с самим потоком.
Это должен быть самый надежный способ независимо от компилятора:
m=std::stringstream();
На мой взгляд, это лучше, потому что m.str (""); заставил мой поток строк застрять с этим пустым значением, что бы я ни пробовал. Но с этим у меня нет такой проблемы
Я столкнулся с той же проблемой, для меня mm.clear(); mm.str(""); помог. (нет C++ 11, иначе подкачка была бы лучше).
@hochl: Почему swap лучше, чем перемещение-назначение?
Думаю, это тоже было бы хорошо. Если производительность важна, вы можете проверить, что быстрее, и выбрать соответствующий вариант.
Почти наверняка самый быстрый и лучший ответ, но требует C++ 11.
Это не подходит для всех ситуаций. Это будет перераспределять буфер каждый раз, в то время как mm.str ("") - нет.
Мой основной вариант использования для очистки объекта строкового потока - это сохранение локального объекта строкового потока, чтобы предотвратить ненужное создание экземпляра строкового потока - создание экземпляра нового объекта строкового потока копирует глобальный объект локали - теоретически это быстро и требует только увеличения атомарного, но на уровне параллелизма, с которым я сталкиваюсь, это часто приводит к параличу.
use of deleted function ‘std::basic_stringstream<char>& std::basic_stringstream<char>::operator=(const std::basic_stringstream<char>&)
мои 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?
Вы можете очистить состояние ошибки и очистить поток строк в одной строке
std::stringstream().swap(m); // swap m with a default constructed stringstream
Это эффективно сбрасывает m в сконструированное состояние по умолчанию.
Это наиболее эффективный и элегантный способ сделать это по сравнению со всеми другими ответами здесь. Однако std :: stringstream :: swap - это функция C++ 11, и это решение не работает для предыдущих компиляторов C++ 11.
Функция все еще отсутствует в GNU g ++ v4.8, см. stackoverflow.com/questions/24429441/…
@ 101010: Чем подкачка лучше, чем назначение перемещения?
@Deduplicator - подкачки нет кроме
@AsetD: Даже если это не исключение, вы забыли временную конструкцию, созданную по умолчанию?
Это малоэффективно. Когда я хочу повторно использовать исходный файл ss. Он меняет пустое место для меня.
@ 101010 Я ожидал, что это будет намного эффективнее меньше, чем вызов m.str({}), как сказано в комментарии Чжана. Чтобы уточнить: когда вы вызываете m.str({}), я ожидал, что он будет повторно использовать часть памяти, выделенной во время первой операции, для ускорения следующей операции. Когда вы вызываете std::stringstream().swap(m), я ожидаю, что права собственности на любую память, выделенную им во время первой операции, будут переданы только что созданному временному устройству, что приведет к потере шанса на такую эффективность. Хотя было бы интересно увидеть сравнение на практике.
с таким же успехом можно просто сделать m = std::stringstream();, а не обмениваться данными с объектом, который вы удаляете
Я думаю, это вызывает утечку памяти, поскольку исходный адрес памяти m останется в памяти без разрушения. Конструкция stringstream() создает новый объект и меняет его местами на m.
Я думаю, что swap - хорошее общее решение, потому что потоки могут иметь много внутреннего состояния. Что касается временных файлов, я ожидаю, что компилятор их устранит. А выделение чревато; избегайте предварительной оптимизации. Я ожидал, что распределение обычно будет возиться с указателем.
Это концептуальная проблема.
Stringstream - это поток, поэтому его итераторы идут вперед и не могут вернуться. В выходном строковом потоке вам понадобится flush () для его повторной инициализации, как и в любом другом выходном потоке.
Это будет очищено .clear (), который указан в OP.