我使用以下代码将字符串流解析为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编译器)
答案 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
}