Namespaces
Variants

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

Материал из ru.cppreference.net
 
 
 
std::basic_string
 
Определён в заголовке <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 = "Hello, whirled!";
    std::istringstream iss(greeting);
    std::string hello_comma, whirled, word;
    iss >> hello_comma;
    iss >> whirled;
    std::cout << greeting << '\n'
              << hello_comma << '\n' << whirled << '\n';
    // Reset the stream
    iss.clear();
    iss.seekg(0);
    while (iss >> word)
        std::cout << '+' << word << '\n';
}

Вывод:

Hello, whirled!
Hello,
whirled!
+Hello,
+whirled!

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение в опубликованной версии Корректное поведение
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 issue 25 сделало поведение
неопределенным, если os. width ( ) больше чем str. size ( )
определяет заполнение
сначала и вставляет заполненную
последовательность символов вместо этого
LWG 586 C++98 operator<< не вел себя
как FormattedOutputFunction
ведет себя как
FormattedOutputFunction

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

(C++17)
выполняет потоковый вывод для string views
(шаблон функции)