Namespaces
Variants

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

From cppreference.net
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 >> ( /* 扩展浮点类型 */ & 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 中。
此函数的行为类似于 格式化输入函数 。在构造并检查哨兵对象(可能会跳过前导空白字符)后,通过调用 std::num_get::get() 来提取数值。
12) 提取一个 short 值,可能会跳过前面的空白字符。该值将存储到给定的引用 value 中。
此函数的行为类似于 格式化输入函数 。在构造并检查哨兵对象(可能会跳过前导空白字符)后,通过调用 std::num_get::get() 提取 long 类型的值 lval 。随后:
13) 提取一个 int 值,可能会跳过前面的空白字符。该值将存储到给定的引用 value 中。
此函数的行为类似于 格式化输入函数 。在构造并检查哨兵对象(可能会跳过前导空白字符)后,通过调用 std::num_get::get() 提取 long 类型的值 lval 。随后:
14) 提取一个扩展浮点值,可能会跳过前导空白字符。该值将存储到给定的引用 value 中。该库为所有cv非限定的 扩展浮点类型 提供了重载版本,作为参数 value 的引用类型。
按以下规则确定标准浮点类型 FP
  • /* 扩展浮点类型 */ 浮点转换等级 小于等于 float ,则 FP float
  • 否则,若 /* 扩展浮点类型 */ 的浮点转换等级小于等于 double ,则 FP double
  • 否则, FP long double
此函数的行为类似于 格式化输入函数 。在构造并检查哨兵对象(可能会跳过前导空白字符)后,通过调用 std::num_get::get() 提取一个 FP fval 。随后:
  • 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 是一个 I/O 操纵器。
18) 表现为一个 非格式化输入函数 。在构造并检查岗哨对象后,从 * 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 标志位。

目录

参数

value - 用于存储提取值的整数或浮点数引用
func - I/O 操纵器函数指针
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';
    // 使用 streambuf 重载提取剩余内容
    stream >> std::cout.rdbuf();
    std::cout << '\n';
}

输出:

n = 41
f = 3.14
b = false
hello world

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用版本 发布时行为 正确行为
LWG 64 C++98 重载 (18) 是否仅能重新抛出通过调用 setstate ( failbit )
引发的 std::ios_base::failure 异常存在歧义
所有捕获的异常
均可被重新抛出
LWG 118 C++98 重载 (12,13) 将提取操作委托给 num_get::get
但该函数没有针对 short int 的重载版本
提取的是 long
而非 short int
LWG 413 C++98 重载 (18) 仅重新抛出从 sb 提取字符时抛出的异常,
但字符实际是从 * this 提取的
sb 修正为 * this
LWG 567 C++98 由于 LWG 60 的解决方案,重载 (18)
表现为 FormattedInputFunction
其行为表现为
UnformattedInputFunction
LWG 661 C++98 由于 LWG 118 的解决方案,重载 (12,13)
未将提取的数字存储到 value
若无溢出发生
则存储该数字
LWG 696 C++98 提取失败时 value 保持不变 设置为零或最小/
最大值

参见

提取字符和字符数组
(函数模板)
对字符串执行流输入和输出操作
(函数模板)
对位集执行流输入和输出操作
(函数模板)
序列化和反序列化复数
(函数模板)
对伪随机数引擎执行流输入和输出操作
(函数模板)
对伪随机数分布执行流输入和输出操作
(函数模板)
提取字符块
(公开成员函数)
提取已可用的字符块
(公开成员函数)
提取字符
(公开成员函数)
提取字符直到找到指定字符
(公开成员函数)
(C++17)
将字符序列转换为整型或浮点型值
(函数)