[英]Why does std::cin's extractor operator wait for user input?
我知道这可能是一个愚蠢的问题,但我不确定如何从终端获得用户输入实际上是有效的。
我从概念上理解输入/输出,我使用它们没有问题,但是当涉及到如何在基本级别实际实现它们时,我迷失了方向。
据我所知,所有流对象都使用一种缓冲区。 如果你提取所有到达eof的字符。 这部分我可能错了,我想了解更多。 例如,当我们使用std :: cin的提取器运算符时,它会等待输入。 它如何区分等待输入和达到eof(没有别的东西可读)?
std::cin
没有做任何特别的事情。 像所有的文件输入,它发出读取系统级( read
Unix中, ReadFile
在Windows中),足够字节填充它的缓存(通常是一些超过1K今天)。 它是检测输入来自键盘的系统,行为不同:从文件中,系统将读取尽可能多的字节,直到文件末尾或请求的数字,并立即返回。 从键盘,系统通常会将字符读入内部缓冲区,直到进入,允许编辑(后退空间等),并且只有在输入时才会将此缓冲区传递回调用者(在添加新行标记之后) )。
编辑:
作为讨论中提到的元素的摘要排序:我将以Unix系统中的情况为例(但Windows基本相同,以报告不同信息的方式为模)。 istream
本身是缓冲的。 当您尝试提取字符( >>
运算符, istream::get
等)时,流将从其缓冲区返回它。 如果缓冲区中没有剩余字符,它将向系统发出read
请求,其地址和缓冲区大小。 (在今天的系统中,我会惊讶地看到一个小于1K的缓冲区。)系统用它做什么将取决于文件描述符指定的内容:
如果read
指示错误,则流将设置badbit
; 如果read
返回0个字符读取,则流将其视为文件末尾。
std :: istream可能具有有限数量的数据(硬盘驱动器上的文件,......)或无限量的数据(传感器,......,交互式用户输入)。 此外,可能还有一个代表EOF的特殊字符。
来自控制台/终端的交互式输入是无限输入。 除非输入特殊字符(Linux:ctl-d),否则流永远不会达到EOF。
来自管道的非交互式输入将(应该/可能)以EOF结尾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.