【问题标题】:while (cin >> x) and end-of-file issueswhile (cin >> x) 和文件结尾问题
【发布时间】:2009-07-03 07:37:20
【问题描述】:

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

它使用这个sn-p:

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

("count" 是整数,"x" 是双精度数)

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

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

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

【问题讨论】:

    标签: c++ loops


    【解决方案1】:

    从某种角度来看,一旦您到达输入流的末尾,那么根据定义,流中就没有任何东西了,因此尝试再次读取它是没有意义的。

    但是,在“流结束”实际上是由 Windows 上的 Ctrl-Z 等特殊字符引起的情况下,我们知道我们有可能再次从 cin 读取。但是,读取失败会导致设置流上的eof 标志。

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

    std::cin.clear();
    

    调用此函数后,您可以尝试再次读取。

    【讨论】:

    • 如果它实际上是输入的结尾(想想管道输入)
    • 这取决于实现,在许多情况下,管道读取只会阻塞直到有要读取的内容,而不是在流上设置失败/eof 位。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 2014-05-19
        • 2020-09-12
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多