std :: get_time - 如何检查解析错误

时间:2015-05-17 04:31:51

标签: c++ windows

我使用以下代码将字符串流解析为tm struct:

std::tm tm;
std::stringstream ss("Jan 9 2014 12:35:34");
ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");

我有兴趣检查是否发生了解析错误(无效输入)。 看来这个函数不会抛出异常。 没有在文档中找到有用的信息: http://en.cppreference.com/w/cpp/io/manip/get_time

听起来像'goodbit'可能是方向,但我不知道该怎么做。

(我正在使用VS2013编译器)

2 个答案:

答案 0 :(得分:7)

与往常一样,std::istream通过设置iostate之一来报告错误,可以使用成员函数fail()operator!或{{3}进行测试}。如果要配置流对象以便在发生错误时抛出异常,则可以调用converting the stream object to bool

这是一个使用成员函数fail()检查是否发生错误的小例子。

#include <iostream>
#include <sstream>
#include <iomanip>

int main()
{
    std::tm t;
    std::istringstream ss("2011-Februar-18 23:12:34");
    ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
    if (ss.fail()) {
        std::cout << "Parse failed\n";
    } else {
        std::cout << std::put_time(&t, "%c") << '\n';
    }
}

答案 1 :(得分:4)

std::get_time()使用std::istream设置状态标志,以防std::time_get<...>::get_time()失败。也就是说,您只需使用

ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");
if (!ss) {
    // deal with an error
}