Spec-Zone.ru › C++

std::basic_istream<CharT,Traits>::operator>>

basic_istream& operator>>( unsigned short& value );
(1)
basic_istream& operator>>( unsigned int& value );
(2)
basic_istream& operator>>( long& value );
(3)
basic_istream& operator>>( unsigned long& value );
(4)
basic_istream& operator>>( long long& value );
(5) (начиная с C++11)
basic_istream& operator>>( unsigned long long& value );
(6) (начиная с C++11)
basic_istream& operator>>( float& value );
(7)
basic_istream& operator>>( double& value );
(8)
basic_istream& operator>>( long double& value );
(9)
basic_istream& operator>>( bool& value );
(10)
basic_istream& operator>>( void*& value );
(11)
basic_istream& operator>>( short& value );
(12)
basic_istream& operator>>( int& value );
(13)
basic_istream& operator>>( /* extended-floating-point-type */& value );
(14) (начиная с C++23)
basic_istream& operator>>( std::ios_base& (*func)(std::ios_base&) );
(15)
basic_istream& operator>>( std::basic_ios<CharT, Traits>& 
                               (*func)(std::basic_ios<CharT, Traits>&) );
(16)
basic_istream& operator>>( basic_istream& (*func)(basic_istream&) );
(17)
basic_istream& operator>>( std::basic_streambuf<CharT, Traits>* sb );
(18)

Извлекает значения из входного потока.

1-11) Извлекает значение, при необходимости пропуская предшествующие пробельные символы. Значение сохраняется по заданной ссылке value.
Эта функция ведёт себя как функция форматированного ввода. После создания и проверки объекта sentry, который может пропустить начальные пробельные символы, извлекает значение, вызывая std::num_get::get().
12) Извлекает значение типа short, при необходимости пропуская предшествующие пробельные символы. Значение сохраняется по заданной ссылке value.
Эта функция ведёт себя как функция форматированного ввода. После создания и проверки объекта sentry, который может пропустить начальные пробельные символы, извлекает значение типа long lval, вызывая std::num_get::get(). После этого:
  • Если lval < std::numeric_limits<short>::min(), устанавливает failbit и сохраняет std::numeric_limits<short>::min() в val.
  • Иначе, если std::numeric_limits<short>::max() < lval, устанавливает failbit и сохраняет std::numeric_limits<short>::max() в val.
  • В противном случае сохраняет static_cast<short>(lval) в val.
13) Извлекает значение типа int, при необходимости пропуская предшествующие пробельные символы. Значение сохраняется по заданной ссылке value.
Эта функция ведёт себя как функция форматированного ввода. После создания и проверки объекта sentry, который может пропустить начальные пробельные символы, извлекает значение типа long lval, вызывая std::num_get::get(). После этого:
  • Если lval < std::numeric_limits<int>::min(), устанавливает failbit и сохраняет std::numeric_limits<int>::min() в val.
  • Иначе, если std::numeric_limits<int>::max() < lval, устанавливает failbit и сохраняет std::numeric_limits<int>::max() в val.
  • В противном случае сохраняет static_cast<int>(lval) в val.
14) Извлекает расширенное значение с плавающей точкой, при необходимости пропуская предшествующие пробельные символы. Значение сохраняется по заданной ссылке value. Библиотека предоставляет перегрузки для всех расширенных типов с плавающей точкой без квалификаторов cv, используемых в качестве ссылочного типа параметра value.
Стандартный тип с плавающей точкой FP определяется следующим образом:
  • Если ранг преобразования типа с плавающей точкой для /* extended-floating-point-type */ меньше или равен рангу типа float, то FP — это float.
  • Иначе, если ранг преобразования типа с плавающей точкой для /* extended-floating-point-type */ меньше или равен рангу типа double, то FP — это double.
  • В противном случае FP — это longdouble.
Эта функция ведёт себя как функция форматированного ввода. После создания и проверки объекта sentry, который может пропустить начальные пробельные символы, извлекает значение FP типа fval, вызывая std::num_get::get(). После этого:
  • Если fval < -std::numeric_limits</* extended-floating-point-type */>::max(), устанавливает failbit и сохраняет -std::numeric_limits</* extended-floating-point-type */>::max() в val.
  • Иначе, если std::numeric_limits</* extended-floating-point-type */>::max() < fval, устанавливает failbit и сохраняет std::numeric_limits</* extended-floating-point-type */>::max() в val.
  • В противном случае сохраняет static_cast</* extended-floating-point-type */>(fval) в val.
15-17) Вызывает func(*this), где func — это манипулятор ввода-вывода.
18) Ведёт себя как функция неформатированного ввода. После создания и проверки объекта sentry извлекает все данные из *this и сохраняет их в sb. Извлечение прекращается при выполнении одного из следующих условий:
  • входная последовательность достигает конца файла;
  • вставка в выходную последовательность завершается неудачей (в этом случае вставляемый символ не извлекается);
  • возникает исключение (в этом случае исключение перехватывается и повторно выбрасывается, только если ни одного символа не вставлено и в exceptions() включён failbit).
В любом случае количество извлечённых символов сохраняется в переменной-члене, значение которой можно получить последующими вызовами gcount(). Если sb — нулевой указатель или в sb не вставлено ни одного символа, вызывает setstate(failbit) (которая может выбросить std::ios_base::failure, если это включено).

Если извлечение завершается неудачей (например, если вместо цифры введена буква), в value записывается ноль и устанавливается failbit. Для знаковых целых чисел, если в результате извлечения получено значение, слишком большое или слишком маленькое для представления в value, записывается соответственно std::numeric_limits<T>::max() или std::numeric_limits<T>::min() и устанавливается флаг failbit. Для беззнаковых целых чисел, если в результате извлечения получено значение, слишком большое или слишком маленькое для представления в value, записывается std::numeric_limits<T>::max() и устанавливается флаг failbit.

Параметры

значение - ссылка на целое число или значение с плавающей точкой, в которое сохраняется извлечённое значение
функция - указатель на функцию-манипулятор ввода-вывода
sb - указатель на буфер потока, в который записываются все данные

Возвращаемое значение

1-16,18) *this
17) func(*this)

Примечания

Для перегрузки (14), если ранг преобразования расширенного типа с плавающей точкой не совпадает с рангом ни одного стандартного типа с плавающей точкой, двойное округление при преобразовании может привести к неточным результатам. В ситуациях, когда важна максимальная точность, можно использовать std::from_chars().

Пример

#include <iomanip>
#include <iostream>
#include <sstream>

int main()
{
    std::string input = "41 3.14 false hello world";
    std::istringstream stream(input);
    
    int n;
    double f;
    bool b;
    
    stream >> n >> f >> std::boolalpha >> b;
    std::cout << "n = " << n << '\n'
              << "f = " << f << '\n'
              << "b = " << std::boolalpha << b << '\n';
    
    // extract the rest using the streambuf overload
    stream >> std::cout.rdbuf();
    std::cout << '\n';
}

Вывод:

n = 41
f = 3.14
b = false
hello world

Отчёты об ошибках

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

DR Применяется к Опубликованное поведение Корректное поведение
LWG 64 C++98 было неясно, может ли перегрузка (18) повторно выбросить только
std::ios_base::failure, выброшенное при вызове setstate(failbit)
можно повторно выбросить
все перехваченные исключения
LWG 118 C++98 перегрузки (12,13) делегировали извлечение функции num_get::get,
у которой нет перегрузок для short и int
вместо значения типа short или int
извлекается значение типа long
LWG 413 C++98 перегрузка (18) повторно выбрасывала только исключения, возникшие при извлечении
символов из sb, однако символы извлекаются из *this
исправлено sb на *this
LWG 567 C++98 перегрузка (18) вела себя как функция форматированного ввода
вследствие решения по вопросу LWG 60
она ведёт себя как
функция неформатированного ввода
LWG 661 C++98 перегрузки (12,13) не сохраняли извлечённое число
в value вследствие решения по вопросу LWG 118
сохраняют число, если
переполнения не происходит
LWG 696 C++98 value не изменялось при ошибке извлечения устанавливается в ноль или минимальное/
максимальное значение

См. также

operator>>(std::basic_istream)
извлекает символы и массивы символов
(шаблон функции)
operator<<operator>>
выполняет ввод и вывод строк в поток
(шаблон функции)
operator<<operator>>
выполняет ввод и вывод битовых наборов в поток
(шаблон функции)
operator<<operator>>
сериализует и десериализует комплексное число
(шаблон функции)
operator<<operator>>
(C++11)
выполняет ввод и вывод псевдослучайного генератора в поток
(шаблон функции)
operator<<operator>>
(C++11)
выполняет ввод и вывод распределения псевдослучайных чисел в поток
(шаблон функции)
read
извлекает блоки символов
(открытая функция-член)
readsome
извлекает уже доступные блоки символов
(открытая функция-член)
get
извлекает символы
(открытая функция-член)
getline
извлекает символы до обнаружения заданного символа
(открытая функция-член)
from_chars
(C++17)
преобразует последовательность символов в целое число или значение с плавающей точкой
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_istream/operator_gtgt

Spec-Zone.ru

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