2011-09-14 16 views
8

Tengo el siguiente ciclo. Debe leer números hasta EndOfFile, o la entrada del usuario -999cin.clear() no restablece el objeto 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; 
} 
} 

Cuando la entrada de usuario una cosa no válida, como algunos char s, este bucle se repite para siempre, sin clear ing el estado de error o se detenga.

Respuesta

8

Después de llamar al clear, debe eliminar de algún modo la entrada no válida de la transmisión. Aquí está una manera:

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; 
} 

Es porque cuando cin no puede leer la entrada no válida, permanece allí en la corriente. Tiene que ser eliminado, de alguna manera. Acabo de leer e ignorarlo.

También se puede utilizar como ignore:

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

que es mejor en mis entradas de opinión siempre son espacio separado (y si no desea inspeccionar la entrada no válida). El online doc dice:

istream :: ignorar

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

extraer y descartar caracteres

Extractos caracteres de la secuencia de entrada y los descartes.

La extracción finaliza cuando se han extraído n caracteres y se ha descartado o cuando se encuentra el delimitador de caracteres, lo que ocurra primero. En este último caso, también se extrae el caracter delim.

+1

De ahí el ciclo infinito !! –

+0

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

+0

@ Mr.DDD: ¿Qué entrada no válida proporcionaste? – Nawaz

Cuestiones relacionadas