命名空间
变体
操作

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

来自 cppreference.cn
< 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) (since C++11)
basic_istream& operator>>( unsigned long long& value );
(6) (since 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) (since 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。在构造并检查哨兵对象(可能跳过前导空白符)之后,通过调用 std::num_get::get() 提取一个值。
12) 提取一个 short 值,可能会跳过前导空白符。该值存储到给定的引用 value 中。
此函数行为如同FormattedInputFunction。在构造并检查哨兵对象(可能跳过前导空白符)之后,通过调用 std::num_get::get() 提取一个 longlval。之后
13) 提取一个 int 值,可能会跳过前导空白符。该值存储到给定的引用 value 中。
此函数行为如同FormattedInputFunction。在构造并检查哨兵对象(可能跳过前导空白符)之后,通过调用 std::num_get::get() 提取一个 longlval。之后
14) 提取一个扩展浮点值,可能会跳过前导空白符。该值存储到给定的引用 value 中。库为所有 cv-无限定的 扩展浮点类型 作为参数 value 的引用类型提供了重载。
确定标准浮点类型 FP 如下
  • 如果 /* extended-floating-point-type */浮点转换等级 小于或等于 float 的等级,则 FPfloat
  • 否则,如果 /* extended-floating-point-type */ 的浮点转换等级 小于或等于 double 的等级,则 FPdouble
  • 否则,FPlong double
此函数行为如同FormattedInputFunction。在构造并检查哨兵对象(可能跳过前导空白符)之后,通过调用 std::num_get::get() 提取一个 FPfval。之后
  • 如果 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) 行为如同UnformattedInputFunction。在构造并检查哨兵对象之后,从 *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';
 
    // 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) 是否只能重新抛出由调用 setstate(failbit) 抛出的
std::ios_base::failure
所有捕获的异常
可以被重新抛出
LWG 118 C++98 重载 (12,13) 将提取委托给 num_get::get
但它没有 shortint 的重载
提取一个 long
而不是 shortint
LWG 413 C++98 重载 (18) 仅重新抛出在从 sb 提取字符时抛出的异常,但字符是从 *this 提取的
字符是从 *this 提取的
sb 更正为 *this
LWG 567 C++98 重载 (18) 的行为如同 FormattedInputFunction
由于 LWG issue 60 的决议
它的行为如同一个
UnformattedInputFunction
LWG 661 C++98 由于 LWG issue 118 的决议,重载 (12,13) 不会将提取的数字存储到 value
由于 LWG issue 118 的决议,重载 (12,13) 不会将提取的数字存储到 value
如果未发生溢出,则存储数字
如果未发生溢出,则存储数字
LWG 696 C++98 value 在提取失败时未更改 value 在提取失败时未更改
设置为零或最小值/最大值

[编辑] 参见

提取字符和字符数组
(函数模板) [编辑]
对字符串执行流输入和输出
(函数模板) [编辑]
执行 bitset 的流输入和输出
(函数模板) [编辑]
序列化和反序列化复数
(函数模板) [编辑]
对伪随机数引擎执行流输入和输出
(函数模板) [编辑]
对伪随机数分布执行流输入和输出
(函数模板) [编辑]
提取字符块
(公共成员函数) [编辑]
提取已提供的字符块
(公共成员函数) [编辑]
提取字符
(公共成员函数) [编辑]
提取字符直到找到给定的字符
(公共成员函数) [编辑]
将字符序列转换为整数或浮点值
(函数) [编辑]