如何在C ++中清空输入流?

时间:2012-12-20 10:19:02

标签: c++ iostream

我知道如何在C中执行此操作但不知道C ++解决方案。我希望以下内容是故障安全的,但在为输入提供字符串甚至字符后,程序挂起。如何读取包含\ n的输入流以释放它?

int main() {
    int num;
    do { 
        std::cin.clear();
        std::cin >> num;
        while ( std::cin.get() != '\n' );
    } while ( !std::cin.good() || num > 5 );
    return 0;
}

5 个答案:

答案 0 :(得分:2)

一旦流处于错误状态,所有读取操作都将失败。这意味着,如果cin >> num读取失败,则get()调用的循环将永远不会结束:所有这些get()都将失败。只有在清除错误状态后才能跳到行尾。

答案 1 :(得分:1)

要建立在R. Martinho Fernandes的回答之上,这里有一个可能的C ++替代代码:

std::string num;
std::getline(std::cin, num);

// Arbitrary logic, e.g.: remove non digit characters from num
num.erase(std::remove_if(num.begin(), num.end(),
            std::not1(std::ptr_fun((int(*)(int))std::isdigit))), num.end());

std::stringstream ss(num);
ss >> n;
  • std::getline功能从cin中提取字符并存储到num。它还提取并丢弃输入末尾的分隔符(您可以指定自己的分隔符或将使用\n。)
  • string::erase功能会删除num字符串中的所有字符,但使用带有std::remove_if谓词的std::isdigit std::stringstream来删除。{/ li>
  • 然后使用{{1}}将字符串表示为整数(a boost::lexical_cast也可以使用)

擦除函数实现的逻辑可以是任何其他逻辑,但是这个代码可能比问题中包含的逻辑简单得多。

答案 2 :(得分:0)

我会使用getline(cin,num)接近它,然后使用cin.fail()捕获任何失败。我通常使用带有整数的cin.fail()但理论上也应该使用字符串和字符,例如:

    string num;
    getline(cin,num);
    if(cin.fail())
    {
      cin.clear();
      cin.ignore();
    }

答案 3 :(得分:0)

一种方法是在每次输入后检查状态,如果发生这种情况则抛出异常 例如:

#include<iostream>
using namespace std;

int main(){

int a;
cout<<"Enter a number: ";
cin>>a;

//If a non number is entered, the stream goes into a fail state
try
{
    if(cin.fail()){
        throw 0;
        cin.clear();
        cin.ignore();
    }
}
catch(int){
    cin.clear();
    cin.ignore();
}
return 0;
}

之后,您可以继续使用您想要的任何代码

答案 4 :(得分:0)

要清除输入流,请使用cin.sync()。   无需使用cin.clear()或cin.ignore()。