cin缓冲区不被忽略?

时间:2016-10-13 15:54:07

标签: c++ cin

 after=nint(1000*before)/nint(1000*dx) 

这里我要求一个整数,然后是' r'或者' w'。但是,当输入像' 4r'进入第一个while语句,' r'保持在缓冲区并应用于下一个while语句。我该如何解决这个问题?

如果第一个while循环中的所有整数而不是截断字符,那么只接受输入的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

你可以ignore()整数后的行上的内容:当读取一个整数时,读取停止在第一个不符合整数的字符,即下面的换行不会是读取。

考虑到你在多个地方的行尾之前忽略了字符,创建和使用操纵器可能是合理的:

std::istream& igln(std::istream& in) {
    return in.ignore(std::numeric_limits<std::streamsize>::max());
}
...
while (std::cout << "Read or write (r/w): "
    && (!(std::cin>> igln >> rw) || (rw != 'r' && rw != 'w')) {
    std::cout << "Enter r or w!\n";
    if (std::cin.eof()) {
        throw std::runtime_error("reached end of stream\n");
    }
    std::cin.clear();
}

请注意,循环总是忽略该行的其余部分,因此,循环内部不需要它。