c++ - 关于fstream中错误处理的问题

标签 c++ c++11 c++14

这是编程:使用 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()

流的

有关更多信息,请查看 failclear .

第二个问题。您的代码不会调用默认构造函数,它只是不会修改 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 不变并使用默认构造函数实例化。

关于c++ - 关于fstream中错误处理的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52127870/

相关文章:

c++ - 使用 ASIO 将带有超时的连接尝试作为组合操作

C++11:在 switch 语句中声明变量

C++ 如何修复多重声明编译器错误

c++ - GDB 在 MSVC2012 和 GCC 7.3.1 之间打印不同的 C++ 输出

c++ - 是否有一个 gtest 等同于夹具级设置/拆卸?

python - 如何使用 distutils 指定 C++11?

c++ - 提供初始化列表构造函数的有效方法

C++ 递归可变参数 Lambda

c++ - 我如何告诉当前或即将在 poll() 中阻塞的线程执行某些操作?

c++ - C++ Battery Collector 教程的编译错误