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

来自cppreference.com
< cpp‎ | io‎ | basic istream
 
 
 
 
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
此函数表现为有格式输入函数 (FormattedInputFunction) 。构造并检查 sentry 对象(可能会跳过前导空格),通过调用 std::num_get::get() 提取值。
12) 跳过潜在的前导空格并提取 short 值。将提取到的值存储到给定的引用 value
此函数表现为有格式输入函数 (FormattedInputFunction) 。构造并检查 sentry 对象(可能会跳过前导空格),通过调用 std::num_get::get() 提取 longlval,然后:
13) 跳过潜在的前导空格并提取 int 值。将提取到的值存储到给定的引用 value
此函数表现为有格式输入函数 (FormattedInputFunction) 。构造并检查 sentry 对象(可能会跳过前导空格),通过调用 std::num_get::get() 提取 longlval,然后:
14) 跳过潜在的前导空格并提取扩展浮点值。将提取到的值存储到给定的引用 value。标准库提供所有以无 cv 限定的扩展浮点类型作为参数 value 的被引用类型的重载。
按以下方法确定标准浮点类型 FP
  • 如果 /* 扩展浮点类型 */浮点转换等级小于或等于 float 的对应等级,那么 FPfloat
  • 否则,如果 /* 扩展浮点类型 */ 的浮点转换等级小于或等于 double 的对应等级,那么 FPdouble
  • 否则,FPlong double
此函数表现为有格式输入函数 (FormattedInputFunction) 。构造并检查 sentry 对象(可能会跳过前导空格),通过调用 std::num_get::get() 提取 FPfval,然后:
  • 如果 fval < -std::numeric_limits</* 扩展浮点类型 */>::max(),那么就会设置 failbit 并将 -std::numeric_limits</* 扩展浮点类型 */>::max() 存储到 val
  • 否则,如果 std::numeric_limits</* 扩展浮点类型 */>::max() < fval,那么就会设置 failbit 并将 std::numeric_limits</* 扩展浮点类型 */>::max() 存储到 val
  • 否则,将 static_cast</* 扩展浮点类型 */>(fval) 存储到 val
15-17) 调用 func(*this),其中 func 是输入/输出操纵符。
18) 表现为无格式输入函数 (UnformattedInputFunction) 。在构造并检查 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 - 到要存储提取值到的整数或浮点值的引用
func - 指向输入/输出操纵符函数的指针
sb - 指向要写入全部数据到的流缓冲的指针

返回值

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

注解

对于重载 (14),当扩展浮点类型的浮点转换等级与任何标准浮点类型的等级都不相同时,转换过程中的双重舍入会导致结果不准确。在需要结果尽可能准确的场合可以使用 std::from_chars()

示例

#include <iostream>
#include <iomanip>
#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) 而抛出的 ios_base::failure
可以重抛所有异常
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 的解决方案而表现为
有格式输入函数 (FormattedInputFunction)
表现为
无格式输入函数 (UnformattedInputFunction)
LWG 661 C++98 重载 (12,13) 由于 LWG 问题 118 的解决
方案不会将提取到的数字存储到 value
在未发生上溢的情况下会存储
LWG 696 C++98 提取失败时不会更改 value 设为零或最大/最小值

参阅

提取字符和字符数组
(函数模板)
执行字符串的流输入与输出
(函数模板)
执行 bitset 的流输入和输出
(函数)
复数的序列化和反序列化
(函数模板)
执行伪随机数引擎的流输入和输出
(函数)
执行伪随机数分布的流输入和输出
(函数模板)
提取一块字符
(公开成员函数)
提取可用的若干块字符
(公开成员函数)
提取字符
(公开成员函数)
持续提取字符,直到找到给定字符
(公开成员函数)
转换字符序列到整数或浮点值
(函数)