operator<<,>>(std::basic_string)
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <string>
|
||
template< class CharT, class Traits, class Allocator > std::basic_ostream<CharT, Traits>& operator<<( std::basic_ostream<CharT, Traits>& os, const std::basic_string<CharT, Traits, Allocator>& str ); |
(1) | |
template< class CharT, class Traits, class Allocator > std::basic_istream<CharT, Traits>& operator>>( std::basic_istream<CharT, Traits>& is, std::basic_string<CharT, Traits, Allocator>& str ); |
(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)
os2)
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 |
Смотрите также
(C++17) |
выполняет потоковый вывод строковых представлений (шаблон функции) |