关于 istream 中的错误处理的问题



这是在《编程:原理与实践使用》一书中定义的运算符C++。我有两个问题。首先,为什么在检测到无效格式后我们设置了一个故障位?其次,为什么在用户输入无效的日期格式后,当cin处于失败状态时,默认构造函数构造日期?

istream& operator>>(istream& is, date& dd)
{
int y, m, d;
char ch1, ch2, ch3, ch4;
is >> ch1 >> d >> ch2 >> m >> ch3 >> y >> ch4;
if (!is) return is;
if (ch1 != '(' || ch2 != ',' || ch3 != ',' || ch4 != ')') { // oops: format error
is.clear(ios_base::failbit);
return is;
}
dd = date{ d,m,y }; // update dd
return is;
}

第一个问题。为了通知使用当前流的下一个函数出现问题,该函数为流的内部错误状态标志设置一个新值。

is.clear(ios_base::failbit);

这样,您可以在使用运算符>>后检查使用功能是否一切顺利

.fail()

的 istream

有关详细信息,请查看失败并清除。

第二个问题。您的代码不会调用默认构造函数,它只是不会修改dd因此,如果您编写了类似

std::ifstream f('date.in')
date d;
f >> d;
if(!f.fail())
{ std::cout << d << std::endl;}
else
{ std::cout << "parsing failed" << std::endl;}

如果 f.fail(( 为真,则 d 保持不变,并且使用默认构造函数实例化。

最新更新