Подтвердить что ты не робот

Как очистить переменную stringstream?

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

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

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

4b9b3361

Ответ 1

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

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

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

m.str("");

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

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

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

Ответ 2

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

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

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

Ответ 3

m.str("");

похоже, работает.

Ответ 4

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

m=std::stringstream();

Ответ 5

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

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

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

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

Ответ 6

мои 2 цента:

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

//clear the stringstream variable

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

//fill up the streamstream variable
sstm << "crap" << "morecrap";

Ответ 7

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

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

Ответ 8

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

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

Следующее освобождает строку string для меня:

    m.str().clear();