while(cin>> x)和文件结束问题

时间:2009-07-03 07:37:20

标签: c++ loops

我对发生了什么感到困惑,我正在使用“Accelerated C ++”中的一些程序,并且遇到了一个早期程序的问题(第35页,如果你碰巧有副本)附近)。

它使用此代码段:

while (cin >> x) {
   ++count;
   sum += x;
}

(“count”是整数,“x”是双精度)

它按预期工作,允许我输入几个值并将它们加在一起,但我无法弄清楚“文件结束”信号出现了什么问题。书中说循环将继续运行,直到程序遇到文件结束信号,即Windows中的ctrl + z。

这一切都很好,并且有效,但之后我的程序不会让我再次使用cin。我通常只是设置一个程序来等待一些随机变量,以便在执行后立即停止控制台关闭(顺便说一下,还有更好的方法吗?)这就是我注意到这一点,我想知道如果有解决方案。我已经做了很多搜索,但发现很少没有说出书中已经说过的内容(按ctrl + z,或输入不兼容的输入类型等。)

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

3 个答案:

答案 0 :(得分:7)

从一个角度来看,一旦你到达输入流的末尾,那么按照定义,流中没有任何内容,所以尝试从中再次阅读是没有意义的。

但是,如果'end-of-stream'实际上是由Windows上的Ctrl-Z引起的特殊字符,我们知道有可能我们可以再次从cin读取。但是,失败的读取将导致设置流上的eof标志。

要清除此标志(以及所有其他失败标志),您可以使用clear方法。

std::cin.clear();

调用此函数后,您可以尝试另一次阅读。

答案 1 :(得分:2)

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

那就是说,我认为可以打开输入的另一个流,但更好,更正常的解决方案是做更好的输入/输出处理,并允许用户输入一些表示“停止接受输入”的标记

答案 2 :(得分:1)

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

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