对于我的一项作业,我被告知要使用cin.clear(ios_base::failbit)
来设置failbit
。我想知道cin.clear(ios_base::failbit)
和cin.setstate(ios_base::failbit)
之间有什么区别?后者不清楚吗?我很惊讶地看到failbit
与clear()
的设置方式。为什么这种反直觉的方式使用clear()
?
答案 0 :(得分:3)
我很惊讶地看到如何使用clear()设置失败位。为什么这种反直觉的方式使用clear()?
好吧,让我们考虑一下。
std::cin.setstate(ios_base::failbit);
如果尚未设置失败位,则会设置失败位,但保留std::cin
的任何其他stream error state。
std::cin.clear(ios_base::failbit);
这将清除std::cin
的所有流错误状态,然后仅设置失败位。
答案 1 :(得分:1)
setstate
和clear
执行不同的操作。他们不一样。
setstate
实际上通过额外操作调用clear
。
基本上,setstate
以某种方式添加额外标记,而clear
是覆盖整个事物。
见这里:http://www.cplusplus.com/reference/ios/ios/setstate/
通过将当前标志与参数状态中的标志组合来修改当前内部错误状态标志(就像执行按位OR运算一样)。 ...
此函数的行为就像定义为:
void ios::setstate (iostate state) {
clear(rdstate()|state); //setstate is doing a OR operation while clear does not.
}
或此处:http://en.cppreference.com/w/cpp/io/basic_ios/setstate
除了当前设置的标志外,还设置流错误标志状态。基本上调用clear(rdstate()| state)。
VC ++的实验代码:
首先了解iostate
常量如何实现:
//Windows Visual C++ implementation
static constexpr _Iostate goodbit = (_Iostate)0x0;
static constexpr _Iostate eofbit = (_Iostate)0x1;
static constexpr _Iostate failbit = (_Iostate)0x2;
static constexpr _Iostate badbit = (_Iostate)0x4;
然后:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
//eof 1, fail 2.
std::ostringstream stream;
stream.setstate(std::ios_base::failbit);
cout << stream.rdstate() << endl; // should get 2
stream.setstate(ios_base::eofbit);
cout << stream.rdstate() << endl; // should get 3
stream.clear(ios_base::eofbit);
cout << stream.rdstate() << endl; // should get 1
}