#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 или успешное возвращение и случайное повреждение памяти.