fread не возвращает ошибку при закрытом файле в C

#c #fread #fclose

#c #fread #fclose

Вопрос:

Насколько я понимаю, fread не должен иметь возможности читать файл после того, как указанный файл был закрыт с помощью fclose. Однако при запуске этого кода

 int main(int argc, char* argv[]){`

    File *fid;
    int test;
    char buf_read [5];
    
    fid = fopen("test.txt", "rb");
    fclose(fid);
    test = fread(buf_read, 1, 5, fid);
    fprintf(stdout, "%d n", test);
}
  

он выводит 5, когда, исходя из моего понимания того, как работает fread, он должен выводить 0, поскольку fread не должен иметь возможности считывать данные из закрытого файла. есть ли какая-то функциональность с fread или fclose, которую я здесь упускаю?

Комментарии:

1. Вы не можете успешно скомпилировать.

2. @JonathonReinhart: он просто ввел его вручную, когда должен был скопировать / вставить. Неважно, причина проблемы легко найдена. В следующий раз это может быть не так просто.

Ответ №1:

Со fclose страницы руководства:

любой дальнейший доступ (включая другой вызов fclose()) к потоку приводит к неопределенному поведению.

Вы вызываете неопределенное поведение; может произойти что угодно, включая, казалось бы, правильное поведение, подобное тому, которое вы испытываете.

Лучшее, что вы можете сделать, это установить для stream ( fid ) значение NULL сразу после вызова fclose .

Комментарии:

1. хорошо, могу ли я ожидать, что тогда будет установлен errno, даже если fread возвращает 5, если я вызываю ferror для указателя закрытого файла?

2. @ColeHavener: когда вы вызываете неопределенное поведение, вы вообще ничего не можете ожидать. Вы, конечно, не можете быть уверены errno в том, что установили. В некоторых системах вы можете получить ошибку segfault или успешное возвращение и случайное повреждение памяти.