La firma de fclose
es la siguiente:
int fclose (FILE * stream);
Eso significa, fclose
espera un puntero a FILE
objeto. Por lo tanto, si pasa 0
, en lugar de un puntero, 0
se entendería como NULL
puntero . Si su puntero NULL, ¿cómo espera que cierre stdin
? No se cerrará Use fclose(stdin)
, ya que stdin
es un puntero al objeto FILE
.
Creo que confunde stdin
con el descriptor de archivo que es de tipo integral, y generalmente se denota como fd
. Es cierto que fd
del flujo de entrada es 0
. Por lo tanto, si desea utilizar fd
(en lugar de FILE*
), debe usar close
desde <unistd.h>
.
#include <unistd.h>
int close(int fildes);
Es decir, close(0)
cerraría la entrada estándar.
1: Parece interesante que si hubiera pasado 1
a fclose con la intención de cerrar stdout
, su código ni siquiera compilar y se vería de inmediato el problema con su código al mismo tiempo de compilación. Ahora la pregunta es, ¿por qué no compilar? Porque a diferencia de 0
, 1
no se convierte implícitamente en tipo de puntero. El compilador generaría un mensaje como "error: invalid conversion from ‘int’ to ‘FILE*’
. Vea el error y el número de línea here at ideone.
fileno (stdin) == 0, pero stdin! = 0 –
¿Está pidiendo * formas * incorrectas de cerrar stdin? Entonces creo que la mayoría de nosotros lo estamos haciendo ahora mismo: -? – cnicutar
¿Estás seguro de que se está cerrando * en * tu aplicación y no * antes * de tu aplicación? ¿'Stdin' funciona correctamente al comienzo de una ejecución de su programa, y luego deja de funcionar en el medio de la ejecución? Si no, tal vez el programa que invocó el suyo se cerró (o nunca configuró) stdin. –