Я уже пробовал несколько вещей,
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.str("");
похоже на работу.
Это должно быть самым надежным способом независимо от компилятора:
m=std::stringstream();
mm.clear(); mm.str("");
сделали свое дело. (нет C ++ 11, иначе обмен был бы лучше).
swap
лучше, чем задание на переезд?
мои 2 цента:
мне показалось, что это работает для меня в xcode и dev-c ++, у меня была программа в форме меню, которое при многократном выполнении по запросу пользователя будет заполнять переменную stringstream, которая будет нормально работать в первый раз, когда код выполнить, но не очистит поток строк в следующий раз, когда пользователь запустит тот же код. но две строки кода ниже, наконец, очищают переменную stringstream каждый раз перед заполнением строковой переменной. (2 часа проб и ошибок и поиск в Google), между прочим, использование каждой строки самостоятельно не поможет.
//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();