Должен ли я fclose (файл), если произошла ошибка?

Код:

FILE *fp = fopen(filename, "r");
if (!fp)
{
    fprintf(stderr, "Failed to open a file\n");
    // fclose(fp) <-- should I close file here?
    exit(1);
}
// Some operations on the file.
fclose(fp);

Вопрос:

Если fopen() не удается открыть файл, следует ли мне все равно звонить fclose()?


person Mateusz Piotrowski    schedule 29.05.2015    source источник


Ответы (1)


Нет, вам не нужно вызывать fclose() внутри блока if. После сбоя fopen() он повторно запускает NULL, который не нужно закрывать.

Чтобы уточнить, если fopen() будет успешным, он вернет FILE *. Это нужно закрыть. FWIW, возвращаемый указатель в этом случае, независимо от значения, гарантирует сравнение неравного значения с NULL. Другими словами, если fopen() проходит успешно, возвращаемый указатель всегда будет FAIL при проверке if(!fp).

В случае ошибки (когда файл не может быть открыт по по какой-либо причине) будет возвращено значение NULL. Возвращаемое значение NULL означает, что файл не был открыт. Вы не закрываете то, что еще не открыто. Простой.

person Sourav Ghosh    schedule 29.05.2015
comment
Я знал, что fopen() возвращает NULL, но не был уверен, открыт файл или нет. Спасибо! - person Mateusz Piotrowski; 29.05.2015
comment
Я бы сказал еще яснее: поскольку при ошибке возвращается ноль, вам нечего закрывать. - person Sami Kuhmonen; 29.05.2015
comment
Висячая проблема: можно ли звонить fclose(NULL)? Я думаю, что это так, но не вижу спецификации для резервного копирования. (Примечание: 2 повтора в ответе) - person chux - Reinstate Monica; 29.05.2015
comment
Я только что проверил fclose(NULL). Ничего особенного не произошло. - person Mateusz Piotrowski; 29.05.2015