`cin.clear()`使输入流处于失败状态



我正在读《加速C++》一书,即使在我的机器上准确复制了他们的代码,我也无法重现他们阅读作业问题的结果。基本问题是在使用EOF后,使用cin.clear((来更改输入流的失败状态,以指示已输入所有等级。作者建议在linux系统上使用Ctrl+D进行EOF。我已经看到了这个和这个,但他们无法解决我的问题。

以下是我的最小工作示例:

#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()也没有帮助。

失败时,您需要清除标志并忽略所有错误输入。

包括#include <limits>作为std::numeric_limits

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。阅读这个答案,找出如何做到这一点。

在C++中被EOF停止后,如何恢复输入流?

最新更新