2011-09-14 15 views
8

Ho il seguente ciclo. Dovrebbe leggere i numeri fino EndOfFile, o l'input dell'utente -999cin.clear() non reimposta l'oggetto cin

int arr[100]; 

int index; 

for (index = 0; index < 100; index++) 
{ 
cin >> arr[index]; 
if (!cin) 
{ 
    cin.clear(); 
    index--; 
    continue; 
} 
if (arr[index] == -999) 
{ 
    break; 
} 
} 

Quando l'input dell'utente una cosa valida, come ad esempio alcuni char s, questo ciclo viene ripetuto per sempre, senza clear ing lo stato di errore o l'arresto.

risposta

8

Dopo aver chiamato clear, è necessario rimuovere in qualche modo l'input non valido dallo stream. Ecco un modo:

cin >> arr[index]; 
if (!cin) 
{ 
    cin.clear(); 
    std::string ignoreLine; //read the invalid input into it 
    std::getline(cin, ignoreLine); //read the line till next space 
    index--; 
    continue; 
} 

E 'perché quando cin non riesce a leggere l'input non valido, vi rimane nel flusso. Deve essere rimosso, con alcuni mezzi. Ho appena letto e ignorato.

È inoltre possibile utilizzare ignore come:

cin.clear(); 
cin.ignore(std::numeric_limits<streamsize>::max(),' '); 

che è meglio a mio parere fornito ingressi sono spazio separati (e se non si vuole ispezionare l'input non valido). Il online doc dice:

IStream :: ignorare

istream & ignorare (streamsize n = 1, int delim = EOF);

Estrarre e scartare caratteri

Estratti caratteri dalla sequenza di ingresso e li rigetti.

L'estrazione termina quando n caratteri sono stati estratti e scartati o quando viene trovato il carattere delim, a seconda di cosa si verifica per primo. In quest'ultimo caso, viene estratto anche il carattere delim stesso.

+1

Quindi il ciclo infinito !! –

+0

@ Mr.DDD: Esattamente. :-) – Nawaz

+0

@ Mr.DDD: quale input non valido fornisci? – Nawaz