2013-12-19 3 views
3

Я пытаюсь включить инструкции, которые немного информируют пользователя о том, почему файл не открывается или не закрывается. Каковы возможные ситуации, когда файл не может быть открыт в режиме записи, и как насчет закрытия?Почему файл не открывается/закрывается

FILE *fp; 

if(!(fp = fopen("testing", "w"))) 
    { 
    fprintf(stderr, "\nError %d: Loading from \"testing\" file failed: %s\n", 
    errno, strerror(errno)); 
    printf("Add additional explanations here\n"); 
    } 

fclose(fp); 
+2

один сценарий - недостаточные разрешения –

+1

Другой просто, что файл не существует – Humungus

+0

2-й: обмена (кто-то чтение/запись без обмена) –

ответ

2

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

То же самое для fclose, это специфическое для ОС, но поскольку он автоматически выполняет fflush, то есть операцию, которая может выйти из строя, если у вас недостаточно места на вашем диске.

1

Функция fopen является системным вызовом. Поэтому причина сбоя сильно зависит от вашей ОС.

Вы можете проверить, какая ошибка произошла, позвонив в зависимости от вашей ОС (getLastError() на Windows и errno на Linux). Кроме того, обычно есть файл заголовка в системах POSIX, который сопоставляет номер с причиной, называемой errno.h.

Вот как пример человек страницы линукс относительно егто:

http://man7.org/linux/man-pages/man3/errno.3.html

+6

Всегда ошибайтесь, если он должен быть портативным. GetLastError() - это Windows, ** errno - C **. –

0

Если fopen() терпит неудачу и errno был установлен EACCES может быть interessing знать пользователю о фактических правах файла в вопрос, поэтому в этом случае может потребоваться обращение к stat(), потянув за эти права и отображая их пользователю.

Также всегда регистрируйте имя файла.

0

Прежде всего, вы можете попробовать использовать perror (см. here).

Также на странице POSIX приведен список ошибок fopen: http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html.

Экстракт из вышеперечисленных:

[EACCES] разрешено поиск запрещена на компоненты префикса пути, или файл существует и разрешение , указанное в режиме отрицается, или файл делает не существует и писать разрешено для родительского каталога файла .

[EINTR] Сигнал был обнаружен во время fopen().

[EISDIR] Именованный файл является каталогом, и для этого режима требуется доступ на запись.

[ELOOP] Цикл существует в символических ссылках, встречающихся при разрешении аргумента пути.

В конце концов, все это сводится к минимуму, если вы хотите сразу же распечатать ошибку или, возможно, вернуть его на более высокий уровень для анализа. Пользователь может не беспокоиться/знать, что такое цикл в символических ссылках.

-1

Windows зависит от расширения файла, чтобы связать файл данных с приложением, используемым для его открытия, которое вызывает ассоциацию файлов.Приложение, связанное с расширением файла, называется его программой по умолчанию. Когда вы дважды щелкаете файл данных, и Windows проверяет расширение файла и не знает, какое приложение вызывается для открытия файла, оно отображает сообщение об ошибке. Решение этой проблемы заключается в изменении ассоциации файлов для расширения файла файла данных.

+0

Windows действительно, но пользовательские приложения этого не делают, вы можете вызывать файлы независимо от того, что хотите, а затем загружать их соответствующим образом для своих целей –

Смежные вопросы