Spec-Zone.ru › C++

operator<<,>>(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) Ведёт себя как функция форматированного вывода. После создания и проверки объекта sentry определяет формат заполнения выходных данных.

Затем вставляет каждый символ из результирующей последовательности 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) Ведёт себя как функция форматированного ввода. После создания и проверки объекта sentry, который может пропустить начальные пробельные символы, сначала очищает 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 (этот пробельный символ остаётся во входном потоке).

Если не извлечено ни одного символа, для is устанавливается std::ios::failbit, что может вызвать исключение 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>> не вёл себя
как функция форматированного ввода
ведёт себя как
функция форматированного ввода
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<< не вёл себя
как функция форматированного вывода
ведёт себя как
функция форматированного вывода

См. также

operator<<
(C++17)
выполняет вывод строкового представления в поток
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/basic_string/operator_ltltgtgt

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API