2010-08-30 12 views
7

Me estoy ejecutando a través de un libro de texto en C++ que tengo como actualización de la programación en C++. Uno de los problemas de práctica (sin entrar en demasiados detalles) quiere que defina una función que se puede pasar ifstream o cin (por ejemplo, istream) como argumento. A partir de ahí, tengo que leer la secuencia. El problema es que no puedo encontrar una manera de tener esta una función use cin y ifstream para encontrar efectivamente el final de la transmisión. A saber,Encuentra el final de la corriente para cin & ifstream?

while(input_stream.peek() != EOF) 

no va a funcionar para cin. Podría volver a trabajar la función para buscar una determinada frase (como "#End of Stream #" o algo así), pero creo que es una mala idea si la secuencia de archivos que paso tiene esta frase exacta.

He pensado usar sobrecarga de funciones, pero hasta ahora el libro ha mencionado cuándo quiere que haga esto. Probablemente estoy poniendo demasiado esfuerzo en este problema de práctica, pero disfruto el proceso creativo y tengo curiosidad si hay una manera de hacerlo sin sobrecargar.

+0

Comprobar esta pregunta: http://stackoverflow.com/questions/3197025/end-of-fileeof-of-standard-input -stream-stdin – Archie

Respuesta

4

eof()hace trabajo para cin. Estas haciendo algo mal; por favor publica tu código. Un obstáculo común es que el indicador eof se establece en después de que intenta leer al final del flujo.

Aquí 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 se pueden generar con Ctrl-Z en Windows y Ctrl-D en muchos otros sistemas operativos)

+0

Disculpa la confusión, tuve inicialmente while (! Input_stream.eof()) pero luego me di cuenta de que había escrito while (input_stream.peek! = EOF) en su lugar. En cualquier caso, ambos métodos funcionan con control + z (irónicamente, estaba leyendo sobre el carácter eof en wikipedia). Gracias por la ayuda de Atzz, ¡y a todos! – user435219

+0

Prefiere convertir la secuencia a un booleano sobre '.eof' o' .bad'. –

2

¿Por qué no funciona std::cin.eof()? cin señalizará EOF cuando se cierre el stdin, lo que sucederá cuando el usuario lo señalice con Ctrl + d (* nix) o Ctrl + z (Windows), o (en el caso de un flujo de entrada entubado) cuando el canal archivo finaliza

+1

En Windows es 'Ctrl + Z',' Ctrl + D' es para sistemas basados ​​en UNIX. – Archie

+0

@Archie Oh, buen punto; agregó que en –

+0

Ah, eso sí funciona (bien Ctrl + Z para windows de todos modos). Lo siento, si hay un poco de confusión como originalmente tuve (! Input_stream.eof()) en la publicación anterior y lo edité en while (input_stream.peek()! = EOF). En cualquier caso, 1 preocupación que tengo sobre usar while (! Input_stream.eof()) es que cuando la función lee el carácter EOF, el bit de falla se establece para input_stream. Se supone que pase esto? – user435219

3

Si usa una secuencia en un contexto booleano, se convertirá en un valor que es equivalente a verdadero si no ha llegado al EOF y falso si se ha intentado leer más allá del EOF (no también es falso si hubo un error anterior al leer la transmisión).

Dado que la mayoría de las operaciones de IO en las transmisiones devuelven la transmisión (para que puedan encadenarse). Puede hacer su operación de lectura y usar el resultado en la prueba (como se indicó anteriormente).

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). 
}