C++ 而(cin>;>;x)和文件结束问题

C++ 而(cin>;>;x)和文件结束问题,c++,loops,C++,Loops,我有点搞不清楚到底发生了什么,我正在玩一些“加速C++”中的程序,并且遇到了一个早期程序的问题(第35页,如果你碰巧在附近有一个副本) 它使用以下代码段: while (cin >> x) { ++count; sum += x; } (“count”是整数,“x”是双精度) 它按预期工作,允许我输入多个值并将它们相加,但我无法找出“文件结束”信号的错误。书中说,循环将一直运行,直到程序遇到文件结束信号,即windows中的ctrl+z 这一切都很好,而且有效,但我的程

我有点搞不清楚到底发生了什么,我正在玩一些“加速C++”中的程序,并且遇到了一个早期程序的问题(第35页,如果你碰巧在附近有一个副本)

它使用以下代码段:

while (cin >> x) {
   ++count;
   sum += x;
}
(“count”是整数,“x”是双精度)

它按预期工作,允许我输入多个值并将它们相加,但我无法找出“文件结束”信号的错误。书中说,循环将一直运行,直到程序遇到文件结束信号,即windows中的ctrl+z

这一切都很好,而且有效,但我的程序不会让我再次使用cin。我通常只是设置一个程序来等待某个随机变量,以便在执行后立即停止控制台关闭(顺便问一下,有没有更好的方法可以做到这一点?)。我已经做了很多搜索,但没有发现什么东西没有说明书中已经说过的内容(按ctrl+z,或输入不兼容的输入类型等)


我正在使用Visual studio 2008 express进行编译。

EOF意味着
STDIN
(也称为
cin
)已关闭。关闭意味着它不能再次使用


也就是说,我认为可以打开另一个输入流,但更好、更正常的解决方案是更好地进行输入/输出处理,并允许用户输入一些表示“停止接受输入”的令牌。

从一个角度来看,一旦你到达了输入流的末尾,那么根据定义,流中什么都没有了,所以再次尝试从中读取是没有意义的

然而,如果“流结束”实际上是由windows上的一个特殊字符(如Ctrl-Z)引起的,我们知道有可能我们可以从
cin
再次读取。但是,读取失败将导致设置流上的
eof
标志

要清除此标志(以及所有其他故障标志),可以使用
clear
方法

std::cin.clear();

调用此命令后,您可以尝试另一次读取。

看起来您正在使用windows(否则您将在控制台上,而窗口将不会关闭)。你有两个选择

  • 从命令行运行应用程序:
    • 启动命令。将cd复制到正确的目录。然后执行命令。
      向控制台正确输出,窗口不会关闭
  • 使用其他方法停止窗口关闭
    • 最简单的方法是暂停。
      系统(“暂停”)
  • 如果不结束输入流,可以重置它。
    • 例如,如果您键入的某些文本导致操作员>>失败,则会设置错误位。
      您可以使用cin.clear()重置错误位
      如果使用ctrl-Z关闭流,这可能不起作用
  • 注意如果您尝试使用cin>>暂停;(暂停是字符或其他东西)
    使用cin.ignore()确保流为空,否则将不会发生暂停
    因为读取数据后代码将继续

如果它实际上是输入的结束(想想管道输入),它取决于实现,在许多情况下,管道读取只会阻塞,直到有东西要读取,而不是在流上设置失败/eof位。