【发布时间】:2018-03-11 10:52:35
【问题描述】:
我的理解是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 对象来测试它,但它无法编译,一个关于受保护的错误。
【问题讨论】:
-
当它是空的时候它会停止直到有东西放进去? 没错。如果没有输入,你不能说你有输入,所以你等待它。
-
程序没有停止。它正在等待输入,这正是您在从交互式设备读取时应该预期的行为。
-
一个文件有确定的大小。如果你到达文件的末尾,你就知道了。如果用户没有输入任何内容,您希望发生什么?
-
所有操作都需要时间。一些操作对该时间的长度没有上限。读取控制台输入就是其中之一
-
流可以绑定到各种各样的东西。你可以有一个读取字符串的流,一个网络连接......当没有数据时,它们的行为都有细微的差异。有些人会报告他们已经结束,有些人会等待更多数据。 cin 流等待您输入更多并按回车