C++ istream::peek - 它不应该是非阻塞的吗?

C++ istream::peek - shouldn't it be nonblocking?

istream::peek 操作阻塞似乎已被接受。

该标准虽然可以说有点模棱两可,但倾向于非阻塞行为。 peek依次调用sgetc,其行为为:

"受控输入序列当前位置的字符,为int类型的值。 如果没有更多字符可从受控输入序列中读取,函数 returns 文件结束值 (EOF)。"

没说"If there are no more characters.......wait until there are"

我是不是漏掉了什么?或者我们使用的 peek 实现有点错误?

受控输入序列是您正在阅读的文件(或其他文件)。所以如果你在文件末尾,它 returns EOF。否则它 return 是文件中的下一个字符。

我在这里看不出任何模棱两可的东西——如果它需要一个尚未从文件中读取的字符,那么它需要读取它(并等待它被读取,然后 return 它).

如果您正在从诸如套接字之类的东西中读取数据,那么它将等待数据到达(或者网络堆栈检测到 EOF,例如对等方断开连接)。

cppreference.com 中的描述可能比您问题中的描述更清楚:

Ensures that at least one character is available in the input area by [...] reading more data in from the input sequence (if applicable)."

"if applicable" 确实适用于这种情况;如果 none 且流不处于 EOF 或其他错误状态,则 "reading data from the input sequence" 需要等待更多数据。

当我对控制台输入感到困惑时,我提醒自己可以将控制台输入重定向为来自文件,因此键盘的行为或多或少模仿了文件的行为。当您尝试从文件中读取一个字符时,您可能会得到以下两种结果之一:您得到一个字符,或者您得到 EOF,因为您已到达文件末尾——没有更多的字符可供读取。键盘输入也是一样:要么你得到一个字符,要么你得到 EOF 因为你已经到达文件的末尾。对于文件,没有等待更多字符的概念:文件要么有未读字符,要么没有。键盘也一样。所以如果你在键盘上还没有到达EOF,读一个字符returns下一个字符。通过键入系统识别为 EOF 的任何字符,您可以在键盘上到达 EOF;在 Unix 系统上是 ctrl-D,在 Windows(如果我没记错的话)上是 ctrl-C。如果还没有到EOF,还有更多的字符要读。