fclose () возвращает 0, если файл успешно закрыт, но в вашем коде
if(!fclose(fp)) {
exit(EXIT_FAILURE);
}
, если fclose () успешно закрывает файл, main () возвращает EXIT_FAILURE, поэтому вы можете изменить это значение на
if(fclose(fp)) {
exit(EXIT_FAILURE);
}
или
if(fclose(fp)!=0){
exit(EXIT_FAILURE);
}
РЕДАКТИРОВАТЬ:
Вопрос в следующем: я должен закрыть fp, если это не stdin или stdout?
if( (fp!=stdin) && (fp!=stdout) )
if( fclose(fp) )
exit(EXIT_FAILURE);
Или
if( (fp!=stdin&&fp!=stdout) && fclose(fp) )
exit(EXIT_FAILURE);
Поскольку && является оператором короткого замыкания и гарантирует оценку слева направо