我有一个关于从格式化字符串中读取 boost::gregorian::date 对象的问题。当输入字符串具有指定的格式时,它会按预期工作。例如,下面的代码
std::string fmt = "%Y-%m-%d";
std::string date_str = "2008-10-23";
boost::gregorian::date date;
boost::gregorian::date_input_facet* i_facet(new boost::gregorian::date_input_facet());
i_facet->format(fmt.c_str());
std::stringstream ss;
ss.exceptions(std::ios_base::failbit);
ss.imbue(std::locale(ss.getloc(), i_facet));
ss << date_str;
ss >> date;
std::cout << date << std::endl;
产生正确的输出。
2008-Oct-23
但是,如果格式与输入字符串不对应,则将字符串流式传输到日期对象会产生错误结果:
// all the code is the same except input string is as follows:
std::string date_str = "20081023";
给
2008-Feb-01
,
所以,问题是为什么它会产生错误的结果而不是抛出异常,尽管 failbit 标志为 ON?
我尝试过使用不同的格式和输入字符串,并且似乎任何类型的可能分隔符的每种混合都可以,除非上面的示例中根本没有分隔符。此外,既没有查看 boost 文档,也没有调查代码本身,我找到了解决方案。
*使用 g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2 编译,boost 版本 1.55