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

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

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

Эквивалентно 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

Смотрите также

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