operator>>(std::basic_istream)

来自cppreference.com
< cpp‎ | io‎ | basic istream
 
 
 
 
在标头 <istream> 定义
template< class CharT, class Traits >

basic_istream<CharT, Traits>&
  operator>>( basic_istream<CharT, Traits>& st, CharT& ch );

template< class Traits >
basic_istream<char, Traits>&
  operator>>( basic_istream<char, Traits>& st, signed char& ch );

template< class Traits >
basic_istream<char, Traits>&

  operator>>( basic_istream<char, Traits>& st, unsigned char& ch );
(1)
(2)
template< class CharT, class Traits>

basic_istream<CharT, Traits>&
  operator>>( basic_istream<CharT, Traits>& st, CharT* s );

template< class Traits >
basic_istream<char, Traits>&
  operator>>( basic_istream<char, Traits>& st, signed char* s );

template< class Traits >
basic_istream<char, Traits>&

  operator>>( basic_istream<char, Traits>& st, unsigned char* s );
(C++20 前)
template< class CharT, class Traits, std::size_t N >

basic_istream<CharT, Traits>&
  operator>>( basic_istream<CharT, Traits>& st, CharT (&s)[N] );

template< class Traits, std::size_t N >
basic_istream<char, Traits>&
  operator>>( basic_istream<char, Traits>& st, signed char (&s)[N] );

template< class Traits, std::size_t N >
basic_istream<char, Traits>&

  operator>>( basic_istream<char, Traits>& st, unsigned char (&s)[N] );
(C++20 起)
template< class Istream, class T >

Istream&&

  operator>>( Istream&& st, T&& value );
(3) (C++11 起)
1-2) 进行字符输入操作。
1) 表现为有格式输入函数 (FormattedInputFunction) 。在构造并检查 sentry 对象(可能跳过前导空白符)后,提取一个字符并将它存储到 ch。如果没有字符可用,那么设置 failbit (在有格式输入函数 (FormattedInputFunction) 所要求的设置 eofbit 外)。
2) 表现为有格式输入函数 (FormattedInputFunction) 。在构造并检查 sentry 对象(可能跳过前导空白符)后,提取后续字符,并将它们存储到 s 指向它的首元素的字符数组 (C++20 前)的相继位置。满足下列任意条件时停止提取:
  • 已经存储了 n - 1 个字符,其中 n 是能存储的最大字符数,定义如下:
如果 st.width() 大于零,n
  • st.width()
(C++20 前)
(C++20 起)
否则 n
  • 能在结尾存储 CharT() 的最大 CharT 数组的元素个数。
(C++20 前)
  • N
(C++20 起)
  • 找到空白字符(以 ctype<CharT> 平面确定)。不提取该空白字符。
  • 输入序列中出现文件尾(也会设置 eofbit)。
在任何情况下,将额外的空字符值 CharT() 存储到输出结尾。如果没有提取任何字符,那么就会设置 failbit(仍写入空字符到输出的首位置)。最后调用 st.width(0) 取消 std::setw 的效果,如果存在。
3) 给定到输入流对象的右值引用,调用适合的提取运算符(与 st >> std::forward<T>(value) 等价)。此重载只有在表达式 st >> std::forward<T>(value) 良构且 Istream 是公开且无歧义派生自 std::ios_base 的类类型时才会参与重载决议。

注解

提取作为流的最后一个字符的单个字符不会设置 eofbit:这与其他有格式输入函数不同,例如以 operator>> 提取最后的整数,但此行为匹配 std::scanf"%c" 格式指定符的行为。

参数

st - 要被提取数据的输入流
ch - 用来存储提取出的字符的到字符的引用
s - 指针,指向 (C++20 前)用来存储提取出的字符的字符数组

返回值

1-2) st
3) std::move(st)

示例

#include <iostream>
#include <iomanip>
#include <sstream>
 
int main()
{
    std::string input = "n greetings";
    std::istringstream stream(input);
 
    char c;
    const int MAX = 6;
    char cstr[MAX];
 
    stream >> c >> std::setw(MAX) >> cstr;
    std::cout << "c = " << c << '\n'
              << "cstr = " << cstr << '\n';
 
    double f;
    std::istringstream("1.23") >> f; // 从右值流提取
    std::cout << "f = " << f << '\n';
}

输出:

c = n
cstr = greet
f = 1.23

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 13 C++98 n 的定义提到了不存在的名字 eos 改成 CharT()
LWG 68 C++98 重载 (2) 不会将空字符存储到输出的末尾 存储一个空字符
LWG 1203 C++11 右值流的重载返回到基类的左值引用 返回到派生类的右值引用
LWG 2328 C++11 右值流的重载要求另一参数是左值 使之接受右值
LWG 2534 C++11 右值流的重没有被制约 已制约

参阅

提取带格式数据
(公开成员函数)