2012-06-28 13 views
6

Ho una domanda che è un po 'simile a questa domanda su StackOverflow std::cin.clear() fails to restore input stream in a good state, ma la risposta fornita non non funziona per me.Ripristino dello Stato di un flusso

La domanda è: come posso ripristinare lo stato di un flusso di 'buono' di nuovo?

Ecco il mio codice come provo, ma lo stato è mai messo a nuovo bene. Ho usato entrambe le righe separatamente.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int result; 
    while (std::cin.good()) 
    { 
     std::cout << "Choose a number: "; 
     std::cin >> result; 

     // Check if input is valid 
     if (std::cin.bad()) 
     { 
      throw std::runtime_error("IO stream corrupted"); 
     } 
     else if (std::cin.fail()) 
     { 
      std::cerr << "Invalid input: input must be a number." << std::endl; 
      std::cin.clear(std::istream::failbit); 
      std::cin.ignore(); 
      std::cin.ignore(INT_MAX,'\n'); 
      continue; 
     } 
     else 
     { 
      std::cout << "You input the number: " << result << std::endl; 
     } 
    } 
    return 0; 
} 

risposta

11

Il codice qui

std::cin.clear(std::istream::failbit); 

realtà non cancellare il failbit, esso sostituisce lo stato corrente del flusso con failbit.

Per cancellare tutti i bit, basta chiamare clear().


La descrizione nello standard è un po 'contorto, indicato come il risultato di altre funzioni

void clear(iostate state = goodbit);

Postcondizione: Se rdbuf()!=0 poi state == rdstate(); altrimenti rdstate()==(state | ios_base::badbit).

che in pratica significa che la prossima chiamata a rdstate() restituirà il valore passato a clear(). Tranne quando ci sono altri problemi, nel qual caso potresti ottenere anche uno badbit.

Inoltre, goodbit in realtà non è affatto un bit, ma ha il valore zero per cancellare tutti gli altri bit.

Per cancellare solo l'un bit specifico, è possibile utilizzare questa chiamata

cin.clear(cin.rdstate() & ~ios::failbit); 

Tuttavia, se si cancella una bandiera e altri rimangono, non è ancora possibile leggere dal flusso. Quindi questo uso è piuttosto limitato.

+0

Nel mio libro si dice: clear (flag) imposta lo stato di condizione specificato su valido. Ho interpretato questo come: cancella il bit di errore specificato. Questo è sbagliato allora? – physicalattraction

+0

È semplicemente 'clear()' per cancellare * tutti * i flag. Cancellare una singola bandiera è un po 'più complicato (e non troppo utile). Ho aggiunto una nuova parte alla mia risposta. –

Problemi correlati