2010-10-04 4 views
2

я потратить как один в этом примере, и каждый раз, когда я получаю ошибку Unable to read cin с ios_base::iostate равным failbit из этого кода:Facet держит неудачу

#include "dates.h" 

#include <iostream> 
#include <ctime> 
#include <locale> 
#include <sstream> 
#include <iterator> 

using namespace std; 

void trasnlateDate(istream&in, ostream&out){ 
    const time_get<char>& dateReader = use_facet<time_get<char> >(in.getloc()); 
    ios_base::iostate state = static_cast<ios_base::iostate>(0); 
    istreambuf_iterator<char> end; 

    tm t; 

    dateReader.get_date(in, end, in, state, &t); 

    if(state == static_cast<ios_base::iostate>(0) || state == ios_base::eofbit){ 
     const time_put<char>& dateWriter = use_facet<time_put<char> >(out.getloc()); 
     char fmt[] = "%x"; 
     if(dateWriter.put(out, out, out.fill(), &t, &fmt[0], &fmt[2]).failed()) 
      cerr << "unable to write to output stream.\n"; 
    }else{ 
     cerr << "Unable to read cin.\n"; 
    } 
} 

int main(){ 
    locale::global(locale("")); 
    cin.imbue(locale("en_US.utf8")); 
    cout.imbue(locale("de_DE.utf8")); 
    trasnlateDate(cin, cout); 
} 

как всегда, GCC 4.4.3 в Ubuntu 10.4 x64

+0

Вы можете использовать 'ios_base :: goodbit' (или' ios :: goodbit') вместо 'state == static_cast (0)' ... несмотря на то, что он назван «бит», это неправильное имя и 'goodbit' равен нулю. – Potatoswatter

+0

Итак, какой вклад вы дали ему через 'cin'? – Potatoswatter

+0

Вход был 2/2/2005 – Sambatyon

ответ

4

Я проверил ваш образец кода на коробке, и пока я не вошел во вход 02/02/2005, он потерпел неудачу точно так же, как вы сказали.

Похоже, что эти ведущие нули в поле месяца и дня необходимы.

+0

+1. Согласно http://www.opengroup.org/onlinepubs/9699919799/functions/strptime.html, на который ссылается стандарт C++, они не должны быть необходимы. Ошибка в GCC, я думаю. Я не могу сообщить об этом, потому что я не могу воспроизвести его; Я на Дарвине ... – Potatoswatter

Смежные вопросы