C++ C++;istream::peek-x27;它不是非阻塞的吗?

C++ C++;istream::peek-x27;它不是非阻塞的吗?,c++,iostream,C++,Iostream,istream::peek操作是阻塞的,这似乎是公认的 该标准虽然有点模棱两可,但倾向于非阻塞行为peek依次调用sgetc,其行为是: 受控输入序列当前位置的字符,作为int类型的值。 如果没有更多字符可从受控输入序列中读取,该函数将返回文件结束值(EOF)。” 它没有说“如果没有更多的字符……等到有” 我是不是遗漏了什么?还是我们使用的peek实现有点错误?受控输入序列就是您正在读取的文件(或任何文件)。所以,若你们在文件的末尾,它会返回EOF。否则,它将返回文件中的下一个字符 我在这里看不

istream::peek
操作是阻塞的,这似乎是公认的

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

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

它没有说“如果没有更多的字符……等到有”


我是不是遗漏了什么?还是我们使用的
peek
实现有点错误?

受控输入序列就是您正在读取的文件(或任何文件)。所以,若你们在文件的末尾,它会返回EOF。否则,它将返回文件中的下一个字符

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


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

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

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


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

当我对控制台输入感到困惑时,我提醒自己控制台输入可以重定向到来自文件,因此键盘的行为或多或少模拟了文件的行为。当您尝试从文件中读取字符时,您可以得到两个结果之一:您得到一个字符,或者您得到EOF,因为您已经到达了文件的末尾—没有更多的字符可读取。键盘输入也是一样:要么你得到一个字符,要么你得到EOF,因为你已经到达了文件的末尾。对于一个文件,没有等待更多字符的概念:要么文件有未读字符,要么没有。键盘也是一样。因此,如果键盘上没有达到EOF,读取一个字符将返回下一个字符。通过键入系统识别为EOF的任何字符,可以在键盘上达到EOF;在UNIX系统上,在Windows上(如果我记得正确的话)是CTRL C。如果你还没有达到EOF,那么有更多的字符要被读取。< /P>你引用的文本不是C++引用的一部分。关于的类似文档以及。你是说这些不准确吗?cpluscplus.com是个垃圾网站。您提供的参考链接不包含问题中的文本。事实上,它表示“通过[…]从输入序列(如果适用)中读取更多数据来确保输入区域中至少有一个字符可用”,这在本例中适用,并且“从输入序列读取数据”如果没有数据,且流未处于EOF或其他错误状态,则需要等待更多数据。引号出现在第一个链接中。你推荐哪一个站点去?然后,CPOPYPE,和/或C++标准草案,单词“等待”永远不会出现在我链接的任何规格中。然而,您关于EOF的评论暗示,一旦收到EOF,基本上不应该期望流中有更多的数据。这就是你对EOF的期望吗?在阅读M.M.的评论之后,“确保”这个词似乎非常暗示等待操作……是的,这个问答告诉我我对EOF的想法是错误的。谢谢你的意见