gpt4 book ai didi

c++ - std::cin 是什么让程序停止?

转载 作者:行者123 更新时间:2023-11-28 04:59:07 26 4
gpt4 key购买 nike

我的理解是std::cin是一个std::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 对象来对此进行测试,但它无法编译,出现有关 protected 错误信息。

最佳答案

不要纠结于“缓冲区”。所有输入(好吧,通常)都被缓冲了。这很方便,因为一次从硬件读取一个字符可能非常慢;一次读取一堆字符并将它们存储在某个地方(缓冲区)会更快。这不会影响下面的内容。当您读取一个字符时,如果缓冲区中没有任何内容,系统将查找硬件以寻找下一个字符。如果它找到一个字符,它会把它还给你,也许它会读取更多的字符并将它们存储在缓冲区中;直到读取下一个字符并完成任何适当的缓冲,或者发现它位于输入流的末尾,读取函数才会返回。

当您到达输入流的末尾时,尝试读取会得到 EOF。当输入流是来自文件的文本时,这很容易检测到:当您到达文件末尾时,您就到了输入流的末尾。当输入流是控制台时,很容易混淆。控制台没有固定的终点:您可能只是喝杯咖啡休息一下,并希望回来时输入更多内容。因此,除非您告诉系统控制台已结束其输入,否则它只会等待更多。告诉控制台输入结束的方式取决于系统;在 UNIX 系统上,您可以通过键入 ctrl-D 来完成;在 Windows 下是 ctrl-Z。

关于c++ - std::cin 是什么让程序停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com