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