Если fopen
возвращает NULL, то файл не открыт; вы передаете NULL
в ferror
, что недопустимо. У вас нет открытого файла для передачи; вот что означает NULL
, что он не может дать вам указатель файла. ferror
- для получения ошибок, связанных с чтением и записью файла, если он действительно открыт и у вас есть файл для работы.
Если fopen
завершается неудачно, и вы хотите получить дополнительную информацию о причинах, вам нужно проверить глобальную переменную errno
, определенную в errno.h
.
#include <errno.h>
// ...snip...
if (file == NULL)
printf("Error READING FILE: %s\n", strerror(errno));
В этом примере показано, как извлечь строку, описывающую ошибку; Вы также можете сравнить значение в errno
с одним из возможных значений и сделать что-то другое в зависимости от ошибки. См. fopen
справочную страницу или POSIX spec , для списка возможных ошибок для сравнения. Вот как вы можете проверить различные возможные ошибки:
if (file == NULL) {
int error = errno; // copy it so other calls like printf don't modify it
printf("Error READING FILE: %s\n", strerror(error));
switch (error) {
case EACCESS:
// access was denied
break;
case ENOENT:
// the file or one of its ancestors doesn't exist
break;
// etc...
}
}
(это расширение того, что я первоначально написал в комментарии к другому ответу)