istream中的错误处理问题 这是一个在编程中定义的运算符:C++原理和实践。我有两个问题。首先,为什么在检测到一个无效的格式后我们设置一个failbit?第二,为什么在用户输入了无效的日期格式后,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; }

istream中的错误处理问题 这是一个在编程中定义的运算符:C++原理和实践。我有两个问题。首先,为什么在检测到一个无效的格式后我们设置一个failbit?第二,为什么在用户输入了无效的日期格式后,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; },c++,c++11,c++14,C++,C++11,C++14,第一个问题。要通知使用当前流的下一个函数出现错误,函数将为流的内部错误状态标志设置一个新值 is.clear(ios_base::failbit); 这样,您可以在使用运算符>>后检查使用函数是否都进行得很好 .fail() 峡流 有关更多信息,请查看和 第二个问题。您的代码不调用默认构造函数,它只是不修改dd,因此如果您编写了如下代码 std::ifstream f('date.in') date d; f >> d; if(!f.fail()) { std::cout <

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

is.clear(ios_base::failbit);
这样,您可以在使用运算符>>后检查使用函数是否都进行得很好

.fail()
峡流

有关更多信息,请查看和

第二个问题。您的代码不调用默认构造函数,它只是不修改
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;}
std::ifstream f('date.in')
日期d;
f>>d;
如果(!f.fail())

{std::cout
其次,为什么在用户输入无效的日期格式后,当cin处于失败状态时,日期由默认构造函数构造?
您的代码不会在任何地方默认构造日期。但是您的函数不使用默认构造函数。
date obj;
default构造对象。“那么,包括
is.clear(ios_base::failbit);
和不包括它有什么区别?"不同之处在于,
failbit
在一种情况下会被清除,当然在另一种情况下不会被清除。您不是在设置失败状态,而是在清除它。当提取操作失败时,流设置
failbit
,例如,当您尝试读取整数,但流的内容无法作为一个进行解析时。这就是它是如何让您知道操作失败的。我们在OP的评论中详细讨论了
clear
是如何使用的错误函数,因为它在设置
failbit
的同时清除
eofbit
badbit
应该使用
setstate
。是使用
clear
还是
问题是,为什么在这个例子中,使用C++书的原理和实践,他们使用清晰的函数,然后是每个程序员自己……在这种情况下,我吃了整个比萨饼。我不是一个英语母语者。我想我明白了表达的意思。“我正在吃整个比萨饼”,我已经很喜欢了,但你能不能说一句,确保我不会误解它。“在那之后,每个程序员都是为了自己……”