我的理解是std::cin
是std::istream
个对象。 std::ostream
和std::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
对象来测试它,但它不会编译,这是一个关于受保护的错误。
答案 0 :(得分:1)
不要挂在“缓冲区”上。所有输入(通常)都是缓冲的。这是一种方便,因为从硬件一次读取一个字符可能非常慢;一次读取一堆字符并将它们存储在某处(缓冲区)可以更快。这不会影响下面的内容。当您读取一个字符时,如果缓冲区中没有任何内容,系统会向硬件查找下一个字符。如果它找到一个字符,它会将它返回给你,也许它会读取更多字符并将它们存储在缓冲区中; read函数在读取下一个字符并完成任何适当的缓冲之前不会返回,或者发现它在输入流的末尾。
当您到达输入流的末尾时,尝试阅读会给您EOF。当输入流是文件中的文本时,很容易检测到:当您到达文件末尾时,您就在输入流的末尾。当输入流是控制台时,很容易混淆。控制台没有固有的结局:你可能只是休息一下,并希望在你回来时输入更多东西。因此,除非您告诉系统控制台位于其输入的末尾,否则它将等待更多。告诉控制台它在输入结束时的方式取决于系统;在UNIX系统上,你可以输入ctrl-D;在Windows下它是ctrl-Z。