我正在使用 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/