使该程序停止的STD :: CIN是什么



我的理解是std::cinstd::istream对象。std::ostreamstd::istream对象容纳字符的缓冲区,或者至少参考它们。执行std::cin >> myvar;时,我的理解是您使用>>提取操作员在std::istream对象上从流缓冲区中提取。但是我不明白该程序停止的是什么。我一直在测试它,并且已经注意到,如果它是空的,它似乎只会停止该程序,因为这样做:

char c;
std::cin >> c;  // Awaits input from the console
// I input: 1, 2, 3
std::cin >> c;  // Extracts the 2, no halt
std::cin >> c;  // Extracts the 3, no halt
std::cin >> c; // Awaits input from the console

基本上我想知道std::istream对象的此行为部分。当它空的时候,它停止了直到放入东西?我试图通过创建自己的std::istream对象来测试这一点,但它不会编译,一个错误说明了有关受保护的东西。

不要挂在"缓冲区"上。所有输入(通常)都被缓冲。这是一个方便的,因为每次从硬件阅读角色真的很慢;一次读取一堆字符,然后将它们存储在某个地方(缓冲区)可能会更快。这不会影响下面的内容。当您阅读角色时,如果缓冲区中没有任何内容,则系统将查看下一个字符的硬件。如果它找到一个角色,它将其还给您,也许它会读取更多字符并将其存储在缓冲区中。读取函数在读取下一个字符并进行任何适当的缓冲之前才返回,或者发现它位于输入流的末尾。

当您到达输入流的末尾时,尝试阅读会给您EOF。当输入流是来自文件的文本时,易于检测到:当您到达文件末尾时,您就位于输入流的末尾。当输入流是控制台时,很容易混淆。该控制台没有固有的目的:您可能只是在休息一下咖啡,并希望在回来时输入更多东西。因此,除非您告诉系统该控制台在其输入的末尾,否则它将等待更多。您告诉控制台在输入的末尾的方式取决于系统;在Unix系统上,您可以通过键入CTRL-D来完成;在Windows下是Ctrl-Z。

最新更新