2015-05-17 14 views
8

Używam następujący kod do analizowania stringstream do tm struct:std :: get_time - Jak sprawdzić błąd parsowania

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

Jestem zainteresowany, aby sprawdzić, czy błąd wystąpił podczas analizowania (nieprawidłowe dane). Wygląda na to, że ta funkcja nie zgłasza wyjątku. nie znaleźliśmy Przydatne informacje w dokumentacji: http://en.cppreference.com/w/cpp/io/manip/get_time

Brzmi jak sprawdzanie „goodbit” może być kierunek, ale nie jestem pewien, jak to zrobić.

(używam VS2013 kompilatora)

+1

Próbowałem przeczytać przykład na http://pl.cppreference.com/w/cpp/locale/time_get/get_time, ale moje oczy zaczęły krwawić z powodu szablonu piekła. – wcochran

+0

@wcochran, Nie jesteś sam: / – Yan4321

Odpowiedz

6

Jak zawsze, std::istream raporty błędów poprzez ustawienie jednego z jej iostate, które mogą być testowane przy użyciu funkcji członka fail(), operator! lub przez converting the stream object to bool. Jeśli chcesz skonfigurować obiekt strumienia tak, aby zgłaszał wyjątek w przypadku wystąpienia błędu, możesz zadzwonić pod numer exceptions().

Oto mały przykład, który korzysta z funkcji elementu fail(), aby sprawdzić, czy wystąpił błąd.

#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

Korzystanie std::get_time() z krytym std::istream ustawić flagi państwowe w przypadku std::time_get<...>::get_time() zawiedzie. Oznacza to, że po prostu użyć

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