我正在调查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; }
答案 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
适用于可恢复的错误。如何从输入流中恢复,该输入流应该包含一对用逗号分隔的数字,并且在您已经阅读并包含逗号之后用括号括起来?
您可能能够做到这一点,但是这需要使用tellg
和seekg
以某种方式备份(备份到哪里?) - 然后呢?没有恢复,因此设置badbit
是正确的做法。