【问题标题】:cin.clear(ios_base::failbit) vs cin.setstate(ios_base::failbit)cin.clear(ios_base::failbit) 与 cin.setstate(ios_base::failbit)
【发布时间】:2018-02-28 22:33:16
【问题描述】:

对于我的一项任务,有人告诉我使用cin.clear(ios_base::failbit) 来设置failbit。我想知道,cin.clear(ios_base::failbit)cin.setstate(ios_base::failbit) 有什么区别?后者不是更清楚吗?看到failbit 是如何与clear() 一起设置的,我有点惊讶。为什么使用clear() 会以这种违反直觉的方式使用?

【问题讨论】:

  • 感谢您的编辑。我不是很精通。

标签: c++ istream


【解决方案1】:

看到失败位是如何用 clear() 设置的,我有点惊讶。为什么用这种违反直觉的方式来使用 clear()?

好吧,让我们考虑一下。

 std::cin.setstate(ios_base::failbit);

这将设置失败位(如果尚未设置),但保留任何其他stream error statestd::cin

 std::cin.clear(ios_base::failbit);

这将清除来自std::cin 的所有流错误状态,然后仅设置失败位。

【讨论】:

  • 是的,这就是我感到惊讶的原因。我只会对失败位采取行动,而不要理会其他位。这是 Deitel C++ 9ed book 第 12 章中的一个练习。
【解决方案2】:

setstateclear 做不同的操作。它们是不相同的。

setstate 实际上调用clear 需要额外的操作。

基本上,setstate 以某种方式添加额外的标志,而clear覆盖整个事情

请看这里:http://www.cplusplus.com/reference/ios/ios/setstate/

通过将当前标志与参数状态中的标志组合来修改当前内部错误状态标志(就像执行按位或运算一样)。 ...
这个函数的行为就像定义为:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2014-08-21
    相关资源
    最近更新 更多