public member function
<istream> <iostream>

std::basic_istream::peek

int_type peek();
窥视下一个字符
在不提取它的情况下返回输入序列中的下一个字符:该字符保留为从流中提取的下一个字符。

如果调用之前已设置了任何内部状态标志,或者在调用过程中设置了,则该函数返回文件结束值(traits_type::eof())。

在内部,该函数通过首先构造一个(将 noskipws 设置为 true 的)sentry 对象来访问输入序列。然后(如果good),它通过调用其成员函数 sgetc 从其关联的流缓冲区对象读取一个字符,最后在返回前销毁sentry对象。

调用此函数会将 gcount 的返回值设置为零。

参数



返回值

输入序列中的下一个字符,使用成员 traits_type::to_int_type 转换为 int_type 类型的值。
成员类型int_type是能够表示任何字符值或特殊*文件结束*符的整型。

如果输入序列中没有更多字符可供读取,或者设置了任何内部状态标志,则该函数返回文件结束值(traits_type::eof()),并保留相应的内部状态标志

标志错误
eofbit无法窥视字符,因为输入序列没有可用的字符(已到达文件末尾)。
failbit构造 sentry 失败(例如,当调用前的 *流状态* 不是 good 时)。
badbit流错误(例如,当此函数捕获由内部操作抛出的异常时)。
当设置此标志时,流的完整性可能受到影响。
单个操作可能设置多个标志。

如果操作设置了一个与成员 exceptions 注册的内部状态标志,则该函数将抛出成员类型为 failure 的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// basic_istream::peek example
#include <iostream>     // std::cin, std::cout
#include <string>       // std::string
#include <cctype>       // std::isdigit

int main () {

  std::cout << "Please, enter a number or a word: ";
  std::cout.flush();    // ensure output is written

  std::cin >> std::ws;  // eat up any leading white spaces
  std::istream::int_type c;
  c = std::cin.peek();  // peek character

  if ( c == std::char_traits<char>::eof() ) return 1;
  if ( std::isdigit(c) )
  {
    int n;
    std::cin >> n;
    std::cout << "You entered the number: " << n << '\n';
  }
  else
  {
    std::string str;
    std::cin >> str;
    std::cout << "You entered the word: " << str << '\n';
  }

  return 0;
}

可能的输出
Please, enter a number or a word: foobar
You entered the word: foobar


数据竞争

修改流对象。
对同一流对象的并发访问可能导致数据争用,但标准流对象 cinwcin 当它们与 stdio 同步时除外(在这种情况下,不会产生数据争用,尽管不保证读取的字符归属到哪个线程)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果由此产生的错误状态标志不是 goodbit 且成员 exceptions 被设置为针对该状态抛出,则它将抛出成员类型为 failure 的异常。
对内部操作抛出的任何异常都将被捕获并由该函数处理,设置为 badbit。如果在上次调用 exceptions 时设置了 badbit,则该函数将重新抛出捕获到的异常。

另见