【问题标题】:question concerning cin.clear()关于 cin.clear() 的问题
【发布时间】:2011-10-31 03:35:25
【问题描述】:

我正在阅读 Accelerated C++ 一书。 (我的问题在第 57 页,如果你们有这本书的话)

问题如下: 我们确实有一个读取学生成绩的功能:

...
while (in >> x) {    // in and x are defined as an istream& and as a double
    hw.push_back(x);    // hw is vector defined as vector<double>&
}
in.clear();
...

现在,在书中以及 cplusplus.com 上的参考资料中指出,清除功能会重置所有错误状态,并且输入现在再次准备好读取某些输入。 问题是,如果我放一个:

int a = 0;
cin >> a;
cout << a << endl;

在函数之后它跳过 cin 并给我一个 0。我是否完全理解了 cin.clear() 的函数或者我可以做些什么来让 cin 再次激活。

因为我在读这本书之前也遇到过同样的问题,所以我知道我当时用以下代码解决了这个问题:

    cin.ignore( numeric_limits<streamsize>::max(), '\n');

当然,我必须再按一个额外的回车键,但它会吃掉之前出现的所有东西,这会使 cin 不起作用。

问题是 .clear 和 .ignore 都不能单独正常工作,但是将它们一起使用我可以为变量 a 输入一些内容;

编辑:好的,这是整个代码。这是我自己写的,不是书上的。

istream& in = cin; 
int var = 0;
vector<int> vec;
while ( in >> var ) { 
    vec.push_back(var); 
}
for (int f = 0; f < vec.size(); ++f) {
    cout << vec[f] << endl;
}
cin.clear();
cout << "cleared" << endl;
    int a = 0;
    cin >> a;
    cout << a << endl;

【问题讨论】:

  • cin.clear() 之后,流应该再次处于工作状态,可能问题在于您没有显示的代码;发布展示您的问题的经典“最小可编译示例”。
  • 好的,我添加了一个我自己写的例子。

标签: c++ inputstream


【解决方案1】:

clear 的调用清除了读取失败设置的错误状态。它不会对输入流中可能存在的字符做任何事情。

如果错误状态是由于未能读取双精度而导致的,那么下一个字符很可能也会作为整数失败。

如果你尝试

char ch;
cin >> ch;

我相信这样会更好。

否则您将不得不ignore 一些字符来消除不可读的输入。

【讨论】:

  • 在 1 个函数中有什么可以做 .ignore 和 .clear 操作的吗?
  • 不,但你可以轻松写出一个。 :-)
【解决方案2】:

代码示例中的 while 循环读取整数值,直到输入结束或读取时发生错误,例如给出一个不能以整数形式出现的字符,如 'q'。

发生错误时,您可能有机会通过调用 clear() 然后从 cin 的输入缓冲区中删除违规字符来从错误中恢复:

char dummy;
cin >> dymmy;

然后您可以再次阅读int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 2011-09-22
    • 2018-05-23
    • 2011-11-16
    • 2021-03-27
    • 2017-01-27
    • 2011-01-19
    • 2011-07-20
    相关资源
    最近更新 更多