Pregunta

Estoy corriendo a mí mismo a través de un libro de texto de C ++ que tengo como un repaso a la programación C ++. Uno de los problemas de la práctica (sin entrar en mucho detalle) quiere que definir una función que se puede pasar ifstream o CIN (por ejemplo istream) como argumento. A partir de ahí, tengo que leer a través de la corriente. El problema es que no puedo encontrar una manera de tener este un cin función y el uso de ifstream efectivamente encontrar el final de la secuencia. Es decir,

while(input_stream.peek() != EOF)

No se va a trabajar para cin. Podría reelaborar la función de buscar una frase determinada (como "#End de corriente #" o algo así), pero creo que esto es una mala idea si la secuencia de archivo que pase tiene esta frase exacta.

he pensado que la sobrecarga de funciones uso, pero hasta ahora el libro ha mencionado cuando se quiere que haga esto. Probablemente estoy poniendo demasiado esfuerzo en este problema una práctica, pero disfrutar del proceso creativo y tengo curiosidad si hay tal una manera de hacer esto sin sobrecargar.

¿Fue útil?

Solución

eof() hace trabajo para cin. Estas haciendo algo mal; por favor publicar su código. Un obstáculo común es que la bandera eof consigue el sistema después intenta leer detrás del extremo de la corriente.

Esta es una demostración:

#include <iostream>
#include <string>

int main( int, char*[] )
{
    std::string s;
    for ( unsigned n = 0; n < 5; ++n )
    {
        bool before = std::cin.eof();
        std::cin >> s;
        bool after = std::cin.eof();
        std::cout << int(before) << " " << int(after) << "  " << s << std::endl;
    }

    return 0;
}

y su salida:

D:>t
aaaaa
0 0  aaaaa
bbbbb
0 0  bbbbb
^Z
0 1  bbbbb
1 1  bbbbb
1 1  bbbbb

(EOF puede ser generado con Ctrl-Z en Windows y Ctrl-D en muchos otros sistemas operativos)

Otros consejos

Por qué no funciona std::cin.eof()? cin señalará EOF cuando la entrada estándar se cierra, lo que sucederá cuando las señales de usuario con Ctrl + d (* nix) o Ctrl + z (Windows), o (en el caso de un flujo de entrada por tubería) cuando los extremos de archivos entubada

Si utiliza una corriente en un contexto booleano entonces se convertirá en sí en un valor que es equivalente a la verdad si no ha llegado a la EOF y falso si no se ha hecho un intento de leer más allá del EOF (no es también false si hubo un error de lectura anterior de la corriente).

Como la mayoría de las operaciones de IO en corrientes de retorno de la corriente (por lo que se pueden encadenar). Usted puede hacer su operación de lectura y utilizar el resultado en la prueba (como el anterior).

Así, un programa para leer una secuencia de números de una corriente:

int main()
{
   int x;

   // Here we try and read a number from the stream.
   // If this fails (because of EOF or other error) an internal flag is set.
   // The stream is returned as the result of operator>>
   // So the stream is then being used in the boolean context of the while()
   // So it will be converted to true if operator>>  worked correctly.
   //                         or false if operator>> failed because of EOF
   while(std::cin >> x)
   {
       // The loop is only entered if operator>> worked correctly.
       std::cout << "Value: " << x << "\n";
   }

   // Exit when EOF (or other error).
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top