清除流中的故障位

时间:2018-08-16 19:07:52

标签: c++

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

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

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

2 个答案:

答案 0 :(得分:1)

弄清楚了。我相信这是正确的方法:

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

     // new state is current state, with failbit removed
     auto state = std::cin.rdstate() && ~std::io_base::failbit;

     // sets all of the flags
     std::cin.clear(state);   
}

答案 1 :(得分:0)

要删除单个标志,一些流状态是一个分为两部分的过程。首先,您需要使用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