C — открыть недопустимый файл

#c #fopen

#c #открыть

Вопрос:

Мне интересно, как проверить, открываю ли я файл, который существует с помощью fopen? Я хочу отобразить некоторое сообщение, когда пользователь выбирает файл с неправильным именем. Должна быть какая-то простая проверка, но я не могу ее решить.

Спасибо

Ответ №1:

в вашем списке параметров:

 FILE pFile ;
  

затем:

   pFile = fopen ("myfile.txt","r");

if (pFile == NULL)
printf("No Such File !! ");
  

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

1. это вообще не очень хорошее сообщение об ошибке. «нет такого файла» — это только один из возможных сбоев.

2. Это единственный возможный вариант, потому что, если файл поврежден, он не будет загружаться, например, как программа, но он сможет читать его символы по порядку (или строку или больше).

3. Нет, это не так. Это может быть проблема с разрешениями для файла или пути. Это также может быть ошибкой выделения ресурсов (fopen может вызвать malloc , что может привести к сбою). Говорить «такого файла нет», когда проблема может быть совершенно иной, является плохой практикой и усложнит отладку.

4. Другие возможные ошибки (со страницы руководства Linux для open , которые также являются возможными ошибками для fopen() ): Слишком много символических ссылок, достигнуто максимальное количество открытых файлов для этого процесса, слишком длинный путь, достигнуто максимальное количество открытых файлов для системы, недостаточно памяти ядра, недопустимое имя файловой системы, файл слишком большой.

Ответ №2:

При fopen сбое он возвращает значение NULL и устанавливает errno значение, указывающее тип ошибки.

Проверьте возвращаемое значение, и если это NULL проверка errno . Вы можете использовать такие функции, как perror или strerror , для отображения простых сообщений об этих ошибках.

Ответ №3:

Чтобы было еще понятнее:

 f = fopen("some-file-name.ext", "r");
if (f == NULL) reporterror();
  

Но, вероятно, вы не хотите использовать fopen для проверки существования и права доступа. Вы должны посмотреть на stat и access . Оба доступны в библиотеках C и с использованием man

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

1. Обратите внимание, что access и stat не являются C (они являются POSIX).

2. @Jens — Ты прав. Я помню, что access был на каждой платформе, над которой я работал, но, по-видимому, это не стандартно.

Ответ №4:

Смотрите возможные ошибки для open :

Однако, я думаю, вам будет трудно найти способ определить, что имя файла было недопустимым. В большинстве систем (кроме Windows) любая не слишком длинная строка потенциально допустима (по модулю / интерпретируется как разделитель путей).

Ответ №5:

функция fopen() открывает файл, имя которого указано в параметре filename, и связывает его с потоком, который может быть идентифицирован в будущих операциях по возвращаемому указателю на ФАЙЛ.

 FILE *try_to_open = fopen("Document.txt", "r");    //READ ONLY
  

Если файл успешно открыт, функция возвращает указатель на файловый объект, который может быть использован для идентификации потока при будущих операциях; в противном случае возвращается нулевой указатель. Итак, если вы хотите проверить, что файл был открыт правильно, просто проверьте, что указатель не равен нулю, таким образом:

 if (try_to_open == NULL){
    puts("Opening file failed.");
} else {
    puts("File opened successfully.");
  

Ответ №6:

Это просто: возвращаемый FILE* указатель будет null , если файл не существует.

Конечно, это предполагает, что вы открываете его в r режиме чтения.

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

1. Да, но это будет к лучшему NULL , например, если у него нет соответствующих разрешений.