我正在使用istream :: get()从流中读取字符。问题是,当您读取EOF字符时,get会设置故障位。

我想保持流的干净,因为确实没有发生错误,但是我确实想保留eofbit设置。

如何保持流的当前状态,但未设置故障位。我在理解setstate和clear之间的差异以及如何使用它们“取消”流中的内容时遇到问题。

最佳答案

要删除单个标志,一些流状态是一个分为两个部分的过程。首先,您需要使用rdstate()获取流的当前状态,然后对返回的状态进行按位操作以清除所需的标志。然后,您可以调用clear()并将新状态传递给该状态,以使其设置流的状态。您可以看到所有与此live example一起使用的方法:

int main()
{
    std::cin.setstate(std::ios_base::failbit | std::ios_base::eofbit);

    std::cout << "before:\n";

    if (std::cin.fail()) {
        std::cout << "now cin is in fail state\n";
    }
    if (std::cin.eof()) {
        std::cout << "now cin is in eof state\n";
    }

    auto state = std::cin.rdstate();   // get state
    state &= ~std::ios_base::failbit;  // remove failbit from it
    std::cin.clear(state);             // clear old state and set new state

    std::cout << "\nafter:\n";

    if (std::cin.fail()) {
        std::cout << "now cin is in fail state\n";
    }
    if (std::cin.eof()) {
        std::cout << "now cin is in eof state\n";
    }
}


输出:

before:
now cin is in fail state
now cin is in eof state

after:
now cin is in eof state

10-08 00:41