2015-05-17 3 views
8

Я использую следующий код для разбора stringstream в тме структуру:станд :: get_time - Как проверить для разбора ошибки

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 компилятор)

+1

Я попытался чтение примера в http://en.cppreference.com/w/cpp/locale/time_get/get_time, но мои глаза начали кровоточить из-за шаблон ад. – wcochran

+0

@wcochran, Вы не одиноки// – Yan4321

ответ

6

Как всегда, std::istream сообщения об ошибке, установив один из его iostate, который можно проверить с помощью функции-члена fail(), operator! или по converting the stream object to 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 failed\n"; 
    } else { 
     std::cout << std::put_time(&t, "%c") << '\n'; 
    } 
} 
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 
}