c++ - 清除流中的故障位

标签 c++

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

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

如何保持流的当前状态,但取消设置 failbit。我在理解 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

关于c++ - 清除流中的故障位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51883881/

相关文章:

c++ - 应用于对象指针 vector 的快速排序 - 无限循环

C++:如何模板化一个集合?

c++ - Qt:单实例应用保护的最佳实践

c++ - 如何设置 QWidget 全屏(但 "real"全屏,更改分辨率,将模态设置为整个系统)?

c++ - 如何将 Array 对象从 swift/objective-c 传递和转换为 C++?

c++ - 为指向集合的指针重载开始/结束是个好主意吗

c++ - 如何在 C++ 中使用默认参数初始化 "unsigned char *"?

c++ - 压缩 2 位整数的容器

c++ - 适用于 Dymola 的 Microsoft Visual C++ 编译器

c++ - std::istream 上的 Windows IStream 接口(interface)