为什么即使输入有效也总是设置cin.failbit?

时间:2019-01-03 20:28:49

标签: c++ arrays cin getline

我正在尝试编写一个程序,要求使用cin.getline()输入一个char数组,并且如果给定的输入大于数组长度,则array将被扩展。

我使用cin.failbit来查看用户输入是否太长。但是,一切都没有发生。因此,在调试之后,我发现问题出在failbit上。

所以我写了一个简单的程序来查看问题所在,结果发现cin.failbit 总是 在if语句中甚至返回true当输入看起来有效时。

int main () {
    char name[256];

    std::cout << "Enter your name: ";
    std::cin.getline (name,256, '\n');

    std::cout << "characters read: " << std::cin.gcount() << std::endl;
    if (std::cin.failbit){
        std::cin.clear();
        std::cout << "failed\n";
    }
} 

例如,当输入为“ qwer”时,程序输出已读取5个字符(cin.gcount),因此应该没问题,但它还会输出“ fail”,表示设置了故障位标志。但是我相信在这种情况下不应该这样。

program output here

那么谁能解释为什么failbit似乎被永久设置了?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:3)

std::cin.failbit是一个常量,指示哪个错误位代表流故障。这并不表示流的当前状态。要检查该位是否已设置,请改用成员函数std::cin.fail()

但是,如果由于到达流的末尾而无法读取流,则fail()将返回false,使您相信它成功了。最好使用std::cin.good()来检查上一次操作是否成功。