尝试在cin,peek()中使用

时间:2013-09-02 16:29:19

标签: c++

我尝试从用户输入到空行 所以我写了这个:

while (c != '\n')
{
    c = cin.peek();
    cin >> check;
    if (check == "Test") 
    {
        cin >> ID >> One >> Two >> Three;
        Test[i++] = Test(ID, One, Two, Three);
    }
}     

例如,我现在从用户测试12 45 56 78 99,check = test,id = 45,one,56,two = 78,three = 99 当我输入空行时,为什么while循环没有停止?

2 个答案:

答案 0 :(得分:2)

目前尚不清楚你要做什么;你不要使用 cin.peek()的结果,直到很久以后,完成后 显着更多的输入,而无需测试它是否成功 或不。鉴于代码,我的第一个问题是:你明白吗? while如何运作?修改控制变量的值 在循环内不会导致你突破循环;该 测试仅在循环的顶部完成。你必须总是 在使用变量之前验证输入是否成功 你输入了。

如果您的输入是面向行的,那么经典的解决方案就是 是:

std::string line;
while ( std::getline( std::cin, line ) && !isEmpty( line ) ) {
    std::istringstream parser( line );
    if ( parser >> check >> ID >> One >> Two >> Three >> std::ws
            && parser.get() == EOF ) {
        //  Data is good, can be used...
    } else {
        //  Some sort of format error in the line...
    }
}

我把测试空行放在一个单独的函数中, 因为你可能想要只用空格处理一条线 空的。 (用户可能会不小心碰到空格键 进入,他们看到的仍然看起来像一条空行。) 这也是我在检查之前>>进入std::ws的原因 解析时,行末没有垃圾。

答案 1 :(得分:1)

cin >> check;

是一个格式化的输入函数,这意味着它将丢弃前导空格。空行只是前导空格,它将被丢弃,提取操作符将继续读取,直到非空白数据到达,或发生I / O错误。