c++ - 关于 cin.clear() 的问题

标签 c++ inputstream

我正在阅读 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;

最佳答案

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

如果错误状态是读取 double 失败的结果,下一个字符很可能也将失败为整数。

如果你尝试

char ch;
cin >> ch;

我相信这样会更好。

否则您将不得不忽略一些字符以摆脱不可读的输入。

关于c++ - 关于 cin.clear() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7130925/

相关文章:

java - 读取HTTP InputStream的麻烦

java - 读取输入流

java - 返回空 inputStream 的 URLConnection

c++ - 将 Mat 压缩成 Jpeg 并将结果存入内存

C++ 代码运行时缺少 header ,为什么?

android - Cocos2d-x 应用程序无法为 Android 编译

java - 使用 Java Runtime.getRuntime().exec 调用 aspell 程序的字符集问题

c++ - clang-tidy:什么可能导致 NOLINT 评论不被尊重?

c++ - 在 range v3 库中,为什么 ranges::copy 不适用于 ranges::views::chunk 的输出?

java - 如何读取 BufferedReader 两次或多次?