不能使用cin两次,cin.clear和cin.ignore也不行

时间:2013-11-14 03:01:21

标签: c++ eof cin

我是C ++编程的新手,我遇到了障碍。这是我的代码:

#include <iostream>
using namespace std;

int main(){

    int sum = 0, a;
    cout << "enter first set of numbers:";
    while(cin >> a) sum += a;
    cout << "first sum = " << sum;
    cin.clear();
    cin.ignore( numeric_limits<streamsize>::max(), '\n');

    sum = 0;
    cout << "enter second set of numbers:";
    while(cin >> a) sum += a;
    cout << "second sum = " << sum;
}

我试图将在命令行输入的两组数字相加。问题是,当我点击ctrl-d终止我的第一组数字时,它会跳过第二组cin's。我在互联网上其他地方找到的大多数页面都告诉我使用cin.clear和cin.ignore。我已经尝试过了,但它仍然没有用。这个页面question concerning cin.clear()甚至似乎也有同样的问题。但是,他们认为修复不适合我。

上面的代码是否适用于其他任何人?

3 个答案:

答案 0 :(得分:2)

当您使用Ctrl-D时,您终止输入流:没有来自std::cin的其他字符。即使清除流也无济于事:你已经告诉流它结束了。你不能重新打开它。但是,clear()流并使用ignore()是您问题的解决方案!

您需要一个不同的指标来完成一组值。最简单的方法是使用非数字字符或字符串:尝试读取不是int的内容将导致流进入故障模式[不关闭流]。也就是说,您在转换失败之前阅读,clear()信息流,ignore()一切直到信号线的末尾。

您的代码应该已经这样做了:不要使用Ctrl-D,只需输入,例如x

答案 1 :(得分:0)

//使用stringstream ^^进行多个用户输入

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main (void)
{
    string mystr;
    float price = 0;
    int quantity = 0;

    cout << "Enter price: ";
    getline (cin, mystr);
    stringstream(mystr) >> price;
    cout << "Enter quantity:";
    getline (cin, mystr);
    stringstream(mystr) >> quantity;
    cout << "Total price: " << price*quantity << endl;

    return 0;

}

答案 2 :(得分:-1)

您可以使用Ctrl-D,只需将循环放在另一个线程中即可。所以Ctrl-D,杀死线程,然后返回你的主函数,然后你可以启动另一个线程。 它不是最好的解决方案,但它可以工作,http://codebase.eu/tutorial/posix-threads-c/