为什么`s.clear(ios :: badbit);`下面?为什么不`s.clear(ios :: failbit);`?

时间:2016-05-22 22:45:01

标签: c++ istream

我正在调查this question,我对理解给出的两个答案没有任何问题。但我不确定我是否理解下面突出显示的语句s.clear(ios::badbit);中的注释// set state。例如,为什么不s.clear(ios::failbit);呢?

#include <istream>
#include <complex>

using namespace std;

istream& operator>>(istream& s, complex<double>& a)
{
    // input formats for a complex; "f" indicates a float:
    //
    //   f
    //   (f)
    //   (f, f)

    double re = 0, im = 0;
    char c = 0;

    s >> c;
    if( c == '(' ) {
        s >> re >> c;
        if( c == ',' ) s >> im >> c;
        if( c != ')' ) s.clear(ios::badbit);  // set state
    }
    else {
        s.putback(c);
        s >> re;
    }

    if( s ) a = complex<double>(re, im);
    return s;
} 

2 个答案:

答案 0 :(得分:4)

你引用的这本书是在1991年出版的,也就是在第一个ISO C ++标准出版之前的7年。不清楚为什么作者选择使用ios::badbit因为在本书的第2版或第3版中没有提供任何理由。

在C ++ 98中,为operator>>添加了complex的非成员重载。这要求在输入错误而不是failbit的情况下设置badbit

N1905 26.2 / 13

template < class T , class charT , class traits >
basic_istream < charT , traits >&
operator > >( basic_istream < charT , traits >& is , complex <T >& x );
  

要求:输入值可转换为T

     

如果遇到输入错误,请拨打is.setstate(ios::failbit)(其中   可以抛出ios::failure(27.4.4.3)。

答案 1 :(得分:0)

  

例如,为什么不s.clear(ios :: failbit);代替?

std::ios::failbit适用于可恢复的错误。如何从输入流中恢复,该输入流应该包含一对用逗号分隔的数字,并且在您已经阅读并包含逗号之后用括号括起来?

您可能能够做到这一点,但是这需要使用tellgseekg以某种方式备份(备份到哪里?) - 然后呢?没有恢复,因此设置badbit是正确的做法。