cin.clear(ios_base :: failbit)vs cin.setstate(ios_base :: failbit)

时间:2018-02-28 22:33:16

标签: c++ istream

对于我的一项作业,我被告知要使用cin.clear(ios_base::failbit)来设置failbit。我想知道cin.clear(ios_base::failbit)cin.setstate(ios_base::failbit)之间有什么区别?后者不清楚吗?我很惊讶地看到failbitclear()的设置方式。为什么这种反直觉的方式使用clear()

2 个答案:

答案 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)

setstateclear执行不同的操作。他们不一样。

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

}