Подпись fclose
такова:
int fclose ( FILE * stream );
Это означает, что fclose
ожидает указатель на FILE
объект. Таким образом, если вы передадите 0
вместо указателя, 0
будет восприниматься как NULL
указатель 1 . Если указатель NULL, как вы ожидаете, что он закроет stdin
? Это не закроется. Используйте fclose(stdin)
, так как stdin
сам по себе является указателем на FILE
объект.
Я думаю, вы путаете stdin
с файловым дескриптором, который имеет целочисленный тип и обычно обозначается как fd
. Это правда, что fd
входного потока равен 0
. Так что если вы хотите использовать fd
(вместо FILE*
), то вам нужно использовать close
из <unistd.h>
.
#include <unistd.h>
int close(int fildes);
То есть close(0)
закроет стандартный ввод.
1: Интересно, что если вы передали 1
в fclose с намерением закрыть stdout
, ваш код даже не скомпилировался бы, и вы сразу увидели бы проблему с вашим кодом во время самой компиляции. Теперь вопрос в том, почему он не скомпилируется? Потому что в отличие от 0
, 1
неявно не преобразуется в тип указателя. Компилятор сгенерирует сообщение типа "error: invalid conversion from ‘int’ to ‘FILE*’
. Смотрите ошибку и номер строки здесь на ideone .