【问题标题】:`cin.clear()` leaves the input stream in failure state`cin.clear()` 使输入流处于失败状态
【发布时间】:2020-04-17 02:17:17
【问题描述】:

我正在阅读“Accelerated C++”一书,即使在我的机器上完全复制他们的代码后,我也无法重现他们阅读作业问题的结果。基本问题是关于使用 cin.clear() 改变使用EOF后输入流的失败状态以指示所有等级已输入。作者建议在 Linux 系统上使用 Ctrl+D 进行 EOF。我已经看到thisthis,但他们无法解决我的问题。

这是我的最小工作示例:

#include <iostream>
#include <string>
#include <vector>

using namespace std;
int main()
{
    string name, city;
    vector<double> homework;
    cout << "Enter your name : " ;
    cin >> name;
    cout << "Hello " + name + "!" << endl;
    cout << endl;
    cout << "Enter your grades" << endl;
    if (cin)
    {
        homework.clear();
        double x;
        while (cin >> x)
        {
            homework.push_back(x);
        }
        cin.clear();
    }
    cout << endl;
    cout << "Enter your city : " ;
    cin >> city ; 
    cout << "You live in " + city << endl;; 
    return 0;
}

输入完所有作业后,我按Ctrl+D,然后我希望我现在有机会输入城市名称。但是程序在我的代码末尾打印了两个字符串后才结束。我对cin.clear()的理解有什么问题?我还想指出,在cin.clear() 之后使用cin.ignore() 也无济于事。

【问题讨论】:

  • @SamVarshavchik 你能告诉我一个吗?我急需快速学习 C++。
  • 你需要通过一些考试还是学习c++?此练习(或示例)是人为设计的,如果它引起麻烦,您不必使用 EOF 作为成绩的结尾。使用任何有效的方法,不断进步。
  • @ddbug 不是考试。我需要用 C++ 重写大量 fortran 遗留代码,而且我有大约 1 年的时间。
  • 对不起,不知道有什么书可以立即提供帮助((恕我直言,问题是 EOF(Linux 中的 ctrl/D)呈现 cin 不可用的 TL;DR。所以避免它。例如,指示用户输入 0 或负数作为成绩的结尾。然后继续阅读更多数据。首先使其工作,然后再进行外观改进。
  • @Peaceful 如果你想学习如何写作,现代的C++ 使用 PluralSight 并参加 Kate Gregory 的任何课程

标签: c++ istream


【解决方案1】:

如果失败,您需要清除标记并忽略所有错误输入。

std::numeric_limits 包含#include &lt;limits&gt;

    if ( std::cin.fail( ) )
    {
        std::cin.clear( );
        std::cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n');
    }

如果您想要退出循环的方法,请使用您可以测试的值(例如 -1)。当您收到该值时,退出循环。

double value{ 0 };
while( std::cin >> value && value != -1 )
    homework.push_back( value );

if ( std::cin.fail( ) )
{
    std::cin.clear( );
    std::cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n');
}

编辑:

我没有看到您试图用EOF 结束stream。 阅读此答案以了解如何完成此操作。

How to resume input stream after stopped by EOF in C++?

【讨论】:

  • 这会引发错误:‘numeric_limits’不是‘std’的成员;顺便说一句,我正在用 g++ 编译。
  • 在答案中添加了你需要的header
  • 谢谢。但是使用 cin.ignore() 解决方案(不使用 -1),程序仍然执行它之前所做的:在 Ctrl+D 之后,它只是在不输入城市名称的情况下结束。
  • @Peaceful 更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多