有关istream中错误处理的问题

阿米尔·塔瓦科利(Amir Tavakkoli)

这是《编程:使用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()为true,则d不变,并使用默认构造函数实例化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章