2012-06-04 2 views
1
istream &func(istream &in) 
{ 
    string data; 

    while (in >> data, !in.eof()) { 
     if (in.bad()) 
      throw runtime_error("IO stream corrupted"); 
     if (in.fail()) { 
      cerr << "bad data, try again" << endl; 
      in.clear(); 
      in.ignore(200); 
      continue; 
     } 

     cout << data << endl;; 
    } 

    //in.clear(istream::eofbit | istream::failbit); 
    in.clear(); 

    return in; 
} 

Почему in.clear(istream::eofbit | istream::failbit); не может восстановить значение cin?iostream clear()

но in.clear можно сделать.

PS: Я использую эту функцию в main() и использую в качестве ее параметра cin.

+0

Просто угадайте, вы уверены, что это не 'istream :: badbit', это неудачно? Есть 3 возможных значения, а не два. –

+0

, когда я использую * ctrl-d * для завершения istream, необходимо установить 'eofbit' и' failbit'! – iverson

+0

Что вы подразумеваете под «должен»? Почему не следует устанавливать «badbit»? –

ответ

5

ясно, определяется следующим образом:

недействительными ясно (iostate состояние = goodbit);

Таким образом, эффективно, in.clear(); делает это: in.clear(istream::goodbit);, который сбрасывает поток. Вызов in.clear(istream::eofbit | istream::failbit); установил бы eofbit и failbit, я сомневаюсь, что это то, что вы хотите.

std::cin.clear(std::istream::eofbit | std::istream::failbit); 
std::ios_base::iostate state = std::cin.rdstate(); 
if(state == (std::istream::eofbit | std::istream::failbit)) 
{ 
    std::cout << "eofbit and failbit set" << std::endl; 
} 
+0

, тогда 'clear()' и 'setstate()' не имеют никакой разницы? – iverson

+0

@iverson: 'setstate' вызывает' clear (rdstate() | state); '. Однако здесь разные цели. –

+0

ОК, у меня есть еще один вопрос: я просто проверяю clear(), Если я просто хочу очистить 'failbit', тогда' clear (istream :: failbit) 'также не может работать, как я могу достичь этой цели? – iverson

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

  • Нет связанных вопросов^_^