Пространства имён
Варианты
Действия

operator<<,>>(std::basic_string)

Материал из cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
Функции-элементы
Доступ к элементам
Итераторы
Ёмкость
Операции
Поиск
Константы
Правила вывода (C++17)
Функции, не являющиеся элементами
Ввод/Вывод
operator<<operator>>
Сравнение
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
Числовые преобразования
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Вспомогательные классы
 
Определено в заголовочном файле <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, если таковые имеются.

Эквивалентно return os << std::basic_string_view<CharT, Traits>(str);.

(начиная с 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

[править] Смотрите также

выполняет потоковый вывод строковых представлений
(шаблон функции) [править]