cin 缓冲区没有被忽略?

cin buffer not being ignored?

while(cout << "Enter a positive integer: " &&
        (!(cin >> anInteger) || anInteger < 0))
{
    cout << "Enter a positive integer.\n";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

while(cout << "Read or write (r/w): " &&
        (!(cin >> rw) || (rw != 'r' && rw != 'w')))
{
    cout << "Enter r or w.\n";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

这里我要求一个整数,然后是'r'或'w'。但是,当在第一个 while 语句中输入类似“4r”的内容时,'r' 保留在缓冲区中并应用于下一个 while 语句。我该如何解决这个问题?

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

您可以 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();
}

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