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

StackOverflow https://stackoverflow.com/questions/20731

  •  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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top