2011-03-19 4 views
11

que utiliza "cin" para leer las palabras de flujo de entrada, que al igual queCómo significa no más de entrada para ss cadena en el bucle while (cin >> ss)

int main(){ 
    string word; 
    while (cin >> word){ 
     //do sth on the input word 
    } 

    // perform some other operations 
} 

La estructura del código es algo así como el por encima de uno. Es compilable. Durante la ejecución, sigo ingresando algo como

Mi pregunta es cómo finalizar esta entrada? En otras palabras, supongamos que el archivo de texto es solo "aa bb cc dd". Pero no sé cómo hacer para que el programa sepa que el archivo termina.

Respuesta

17

Tu código es correcto. Si estuvieras ingresando de manera interactiva, necesitarías enviar un carácter EOF, como CTRL-D.

Este carácter EOF no es necesario cuando está leyendo en un archivo. Esto se debe a que una vez que tocas el final de tu flujo de entrada, no queda nada para "cin" (porque la transmisión ya está cerrada), por lo que el ciclo while se cierra.

+12

Vale la pena señalar que la manera en que uno señala un EOF desde el teclado varía según el sistema operativo. MS Windows requiere uno para escribir CTRL-Z, mientras que Unix y los sistemas operativos relacionados requieren CTRL-D. –

+0

@Mike Lewis podría proporcionar una muestra de código? –

1

Presiona Ctrl-Z (Ctrl-D en * nix systems) y presiona enter. Eso envía un EOF e invalida la transmisión.

+0

Eso también detiene el proceso. ¿no? – Nawaz

+0

Eso termina el ciclo while. No estoy seguro de a qué te refieres con el proceso. Estoy confundido, ¿está tomando entrada desde un archivo o desde estándar? ¿O está redireccionando la entrada con jonsca

+1

@Nawaz: No, no detiene el proceso. Puede confundirlo con 'Ctrl-C'. – dappawit

3
int main() { 
    string word; 
    while (cin >> word) { 
     // do something on the input word. 
     if (foo) 
      break; 
    } 
    // perform some other operations. 
} 
0

Supongo que quiere saltar al final del archivo. Puede obtener el valor de basic_ios::eof, devuelve verdadero al final de la transmisión.

3

Como otros ya responder a esta pregunta, me gustaría añadir este punto importante:

Desde Ctrl-Z en Windows (y Ctrl-D en sistemas UNIX) causa EOF alcanzar, y de salir del bucle while , pero fuera del lazo while no puede leer más entradas, ya que el EOF ya se ha alcanzado.

lo tanto, para permitir la lectura utilizando cin de nuevo, es necesario borrar eof bandera, y todas las demás banderas de falla, como se muestra a continuación:

cin.clear(); 

Después de hacer esto, puede comenzar lectura de entrada utilizando cin una vez más!

+0

Exactamente lo que quería. – Hritik

1

cin >> some_variable_or_manipulator siempre evaluará a una referencia a cin. Si desea comprobar y ver si hay más de entrada aún para leer, lo que necesita hacer algo como esto:

int main(){ 
    string word; 
    while (cin.good()){ 
     cin >> word; 
     //do sth on the input word 
    } 

    // perform some other operations 
} 

Esto comprueba goodbit de la corriente, que se establece en true cuando ninguno de eofbit, failbit, o Badbit está configurado. Si se produce un error al leer, o si la secuencia recibió un carácter EOF (al llegar al final de un archivo o desde el usuario en el teclado presionando CTRL + D), cin.good() devolverá false y saldrá de la lazo.

0

Tome la entrada de un archivo. Luego encontrará que el ciclo while termina cuando su programa deja de tomar entrada. En realidad, cin deja de recibir datos cuando encuentra un marcador EOF. Cada archivo de entrada finaliza con este marcador EOF. Cuando este marcador EOF se encuentra en operator>>, modifica el valor del indicador interno eofbit en falso y, en consecuencia, se detiene el ciclo while.

0

Me ayuda a terminar el ciclo presionando ENTER.

int main() { 
    string word; 
    while(getline(cin,word) && s.compare("\0") != 0) { 
     //do sth on the input word 
    } 

    // perform some other operations 
}
-1

su programa no tiene en cuenta los espacios en blanco. hacer diferencia entre CIN y getline ...

He aquí un ejemplo con un truco: el programa de entrada y obtener impresiones de salida hasta llegar a dos veces ENTRAR para salir:

#include <iostream> 
#include <string> 
using namespace std; 

int main(){ 


    char c = '\0'; 
    string word; 
    int nReturn = 0; 

    cout << "Hit Enter twice to quit\n\n"; 

    while (cin.peek()) 
    { 
     cin.get(c); 

     if(nReturn > 1) 
      break; 
     if('\n' == c) 
      nReturn++; 
     else 
      nReturn = 0; 
     word += c; 
     cout << word; 
     word = ""; 
    } 

    cout << endl; 
    return 0; 
} 
+0

Su respuesta no tiene ninguna relación, por lo tanto, no es una respuesta, es una nota al margen. – chbchb55

0

se puede hacer una verificación de una palabra especial en entrada. F.e. "detener":

int main(){ 
    string word; 

    while (cin >> word){ 
     if(word == "stop") 
      break; 

     //do sth on the input word 
    } 

// perform some other operations 
} 
Cuestiones relacionadas