2011-01-15 19 views
5

Para una aplicación C++, ¿cómo puedo forzar programáticamente un fin de archivo (EOF) en stdin?¿Cómo fuerzo eof en stdin?

+0

¿Qué significa 'force EOF on stdin'? Puedes cerrar stdin (o cin). Podrías hacer que tu ciclo termine unilateralmente. Puede buscar hasta el final del archivo (pero eso no ayudará con un terminal o una tubería como entrada). Es posible que puedas forzar el problema con 'freopen()'; reasignar entrada estándar para leer desde/dev/null o NUL :. –

Respuesta

6

En realidad, no se puede. Siempre que pueda leer datos de stdin, no se ha llegado a EOF y, de hecho, nunca podrá alcanzarlo. Sin embargo, puede cerrar el stdin. Para cerrarla, hacer esto:

fclose(stdin); 

Después de esto, no pueden leer datos de stdin.

8

Si se encuentra en un terminal en un sistema tipo Unix, pulse Ctrl-D. En Windows, Ctrl-Z.

Editar: Habiendo visto el deseo de hacer esto "programáticamente", sugiero intentar fclose(stdin). Si de alguna manera eso no es lo suficientemente bueno, una idea más loca podría ser usar std::cin.rdbuf() para configurar la transmisión para que se refiera a algo que no sea el stdin verdadero, y luego haga lo que quiera a esa transmisión. Pero esto empieza a oler mal, como si estuvieras luchando contra la computadora, así que me gustaría saber más sobre cuál es el verdadero objetivo.

+0

Pero esto es dentro de una aplicación C++, ¿también funciona el envío de Ctrl-D? – WilliamKF

+0

Oh veo "programáticamente" ahora. ¿Tal vez puedas describir con más detalle lo que intentas hacer? –

+1

Simplemente escriba 0x1A (el código ASCII para Ctrl + Z) en stdin. – Tergiver

1

Hay una pequeña función agradable disponible para cada flujo creado especialmente para esto.

Su sintaxis es algo así como:

 stream.setstate(stream.flags) 


Así que en su código que puede tener una condición simple que desencadena algo como:

 std::cin.setstate(std::cin.eofbit); 


La documentación para esto es bastante escasa, pero hay algo de en cppreference.com y cplusplus.com.