operator<<,>>(std::basic_string) — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
| Определено в заголовочном файле |
||
|
|
(1) | |
|
|
(2) | |
1) Ведёт себя как FormattedOutputFunction. После создания и проверки объекта ограничителя, определяет заполнение выходного формата.
Затем вставляет каждый символ из результирующей последовательности seq (содержимое str плюс заполнение) в выходной поток os, как при вызове os.rdbuf()->sputn(seq, n), где n это std::max(os.width(), str.size())
В завершении вызывает os.width(0), чтобы отменить эффекты std::setw, если таковые имеются.
|
Эквивалентно |
(начиная с C++17) |
2) Ведёт себя как FormattedInputFunction. После создания и проверки объекта ограничителя, который может пропускать начальные пробелы, сначала очищается str с помощью str.erase(), затем считываются символы из is и добавляются к str, как при вызове str.append(1, c), пока одно из следующих условий не станет истинным:
- прочитано
Nсимволов, гдеNэтоis.width(), еслиis.width() > 0, иначеNэтоstr.max_size(), - в потоке
isвозникает условие конца файла, или std::isspace(c, is.getloc())равноtrueдля следующего символаcвis(этот пробельный символ остаётся во входном потоке).
Если никакие символы не извлекаются, то std::ios::failbit устанавливается в is, что может привести к генерации std::ios_base::failure.
В завершении вызывается is.width(0), чтобы отменить эффекты std::setw, если таковые имеются.
Исключения
1) Может сгенерировать std::ios_base::failure, если во время вывода генерируется исключение.
2) Может сгенерировать std::ios_base::failure, если из is не извлекаются символы (например, поток находится в конце файла или состоит только из пробельных символов) или если во время ввода возникло исключение.
Параметры
| os | — | поток вывода символов |
| is | — | поток ввода символов |
| str | — | строка, которую нужно вставить или извлечь |
Возвращаемое значение
1) os
2) is
Пример
#include <iostream> #include <sstream> #include <string> int main() { std::string greeting = "Привет, закрутился!"; std::istringstream iss(greeting); std::string hello_comma, whirled, word; iss >> hello_comma; iss >> whirled; std::cout << greeting << '\n' << hello_comma << '\n' << whirled << '\n'; // Сбросить поток iss.clear(); iss.seekg(0); while (iss >> word) std::cout << '+' << word << '\n'; }
Вывод:
Привет, закрутился! Привет, закрутился! +Привет, +закрутился!
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 25 | C++98 | n было меньшим из os.width() и str.size()
|
n большее из них
|
| LWG 90 | C++98 | std::isspace(c, getloc()) использовалась для проверкипробелов, но getloc не объявлена в <string>
|
заменили getloc() на is.getloc()
|
| LWG 91 | C++98 | operator>> не вёл себя как FormattedInputFunction
|
ведёт себя как FormattedInputFunction |
| LWG 211 | C++98 | operator>> не устанавливал failbit, если ни один символне извлекался |
устанавливает failbit
|
| LWG 435 | C++98 | символы вставлялись с помощьюos.rdbuf()->sputn(str.data(), n), а разрешениеLWG проблема 25 сделало поведение неопределённым, если os.width() больше, чем str.size()
|
сначала определяет заполнение и вместо него вставляет последовательность символов заполнения |
| LWG 586 | C++98 | operator<< не вёл себя как FormattedOutputFunction
|
ведёт как FormattedOutputFunction |