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

std::get_time - How to check for parsing error

本文关键字:检查 错误 何检查 get time- std      更新时间:2023-10-16

我正在使用以下代码将弦线解析为TM结构:

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编译器)

一如既往,std::istream通过设置其iostate之一来报告错误,可以使用成员函数fail()operator!或将流对象转换为bool进行测试。如果要配置流对象,以便在发生错误时会引发异常,则可以调用exceptions()

这是一个使用成员函数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 failedn";
    } else {
        std::cout << std::put_time(&t, "%c") << 'n';
    }
}

使用 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
}