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

时间:2017-05-24 05:31:13

标签: c++ iostream

似乎很接受istream::peek操作正在阻止。

标准虽然有点含糊不清,却倾向于非阻塞行为。 peek依次调用sgetc,其行为是:

"受控输入序列当前位置的字符,作为int类型的值。 如果没有其他字符可以从受控输入序列中读取,则该函数返回文件结束值(EOF)。"

它没有说"如果没有更多的人物.......等到有"

我在这里遗漏了什么吗?或者我们使用的peek实现是否有点错?

3 个答案:

答案 0 :(得分:4)

受控输入序列是您正在阅读的文件(或其他)。因此,如果您在文件末尾,它会返回EOF。否则它将返回文件中的下一个字符。

我在这里看不到任何模棱两可的东西 - 如果它需要一个尚未从文件中读取的字符,那么它需要阅读它(并等到它读了,并返回)。

如果您正在读取类似套接字的内容,那么它会等到数据到达(或者网络堆栈检测到EOF,例如对等方断开连接)。

答案 1 :(得分:2)

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

  

通过从输入序列中读取更多数据(如果适用),确保输入区域中至少有一个字符可用。“

“如果适用”在这种情况下适用;并且“从输入序列读取数据”需要等待更多数据(如果没有,并且流不处于EOF或其他错误状态。

答案 2 :(得分:2)

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