Как очистить переменную строкового потока?
-
09-06-2019 - |
Вопрос
Я уже попробовал несколько вещей,
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.str("");
кажется, работает.
Это должен быть самый надежный способ независимо от компилятора:
m=std::stringstream();
Я всегда проверяю это:
{
std::stringstream ss;
ss << "what";
}
{
std::stringstream ss;
ss << "the";
}
{
std::stringstream ss;
ss << "heck";
}
мои 2 цента:
похоже, это сработало для меня в xcode и dev-С++, у меня была программа в виде меню, которое при итеративном выполнении по запросу пользователя заполнит переменную строкового потока, которая будет работать нормально в первый раз, когда код будет запуститься, но не очистит строковый поток в следующий раз, когда пользователь запустит тот же код.но две строки кода ниже, наконец, каждый раз очищали переменную stringstream перед ее заполнением.(2 часа проб и ошибок и поиска в Google), кстати, использование каждой строки отдельно не поможет.
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
Это концептуальная проблема.
Stringstream — это поток, поэтому его итераторы направлены вперед и не могут вернуться.В выходном строковом потоке вам понадобится методlush() для его повторной инициализации, как и в любом другом выходном потоке.
Они не отбрасывают данные в строковом потоке в gnu С++.
m.str("");
m.str() = "";
m.str(std::string());
Следующее очищает строковый поток для меня:
m.str().clear();