Как правильно закрыть файл в C - PullRequest
1 голос
/ 10 марта 2020

Я обычно либо читаю из stdin или из имени файла:

FILE *open_file(char *filename, FILE *fallback, char *mode)
{
    FILE *fp = fallback;

    if (filename != NULL) {
        if ((fp = fopen(filename, mode)) == NULL) {
            fprintf(stderr, "Error: cannot open '%s'!\n", filename);
            exit(ERROR_CANNOT_READ_FILE);
        }
    }

    if (fp == NULL) {
        fprintf(stderr, "Error: file error!\n");
        exit(ERROR_CANNOT_READ_FILE);
    }
    return fp;
}

int main(int argc, char* argv[]) {
    FILE *fp = open_file(argc > 1 ? argv[1] : NULL, stdin, "r");

    // some stuff...

    if(!fclose(fp)) {
       exit(EXIT_FAILURE);
    }        
}

В этом примере у меня могут возникнуть проблемы с fclose. Я не могу закрыть ни stdin, ни stdout. Как правильно и условно закрыть fp?

Должен ли я закрыть fp?

1 Ответ

1 голос
/ 10 марта 2020

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);

Поскольку && является оператором короткого замыкания и гарантирует оценку слева направо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...