Как вы очищаете переменную stringstream? - PullRequest
439 голосов
/ 21 августа 2008

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

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

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

Ответы [ 8 ]

707 голосов
/ 21 августа 2008

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

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

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

m.str("");

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

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

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

41 голосов
/ 24 апреля 2014

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

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

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

33 голосов
/ 21 августа 2008
m.str("");

кажется, работает.

32 голосов
/ 11 октября 2012

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

m=std::stringstream();
11 голосов
/ 26 марта 2014

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

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

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

{
    std::stringstream ss;
    ss << "heck";
}
9 голосов
/ 18 октября 2013

мои 2 цента:

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

//clear the stringstream variable

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

//fill up the streamstream variable
sstm << "crap" << "morecrap";
0 голосов
/ 11 октября 2014

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

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

0 голосов
/ 07 сентября 2012

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

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

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

    m.str().clear();
...