Почему я должен использовать close() для закрытия файла?
Я изучаю некоторые файловые функции и, следовательно, сомневаюсь.
мне любопытно, почему нужно звонить close()
закрыть файл? Если бы я не позвал!--0--> после чтения/записи файла, что может случиться? А если я позвоню ... --0-->, могу ли я использовать файловый дескриптор?
6 ответов
Если файл имеет какую-либо буферизацию за ним, и вы не вызываете close, вы можете потенциально потерять данные.
Если ОС имеет ограниченные ресурсы (например, количество открытых файлов), то, не закрывая файлы, вы тратите системные ресурсы.
использование дескриптора после закрытия файла в лучшем случае бессмысленно, массивная ошибка в худшем случае (немного похоже на использование памяти после ее освобождения)
функция close () закрывает соединение между программой и открытым файлом, идентифицированным дескриптором. Любые неписаные системные буферы сбрасываются на диск, и системные ресурсы, используемые файлом, освобождаются
выделенная жирным шрифтом часть является основной причиной закрытия файла
закрытие файла имеет следующие последствия:
1) дескриптор файла освобождается.
2) все блокировки владельцем процесса на файл разблокированы.
3) когда все файловые дескрипторы, связанные с каналом или FIFO, закрыты, все непрочитанные данные отбрасываются.
Если вы не закроете файл, открытый для чтения он может быть заблокирован для одновременной записи. Если вы не закроете файл, открытый для записи - вы можете потерять часть последних записанных данных, которые ОС держит в буфере.
и никогда не используйте дескриптор уже закрытого файла. В этом нет никакого смысла.
когда вы пишете в файл с помощью системного вызова write (), он не записывает сразу в файл. Поэтому после ваших операций вы должны вызвать close (), чтобы буфер был сброшен в файл и изменения сохранялись. После вызова close () нельзя использовать файловый дескриптор.
закрытие файла: После завершения работы с файлом он должен быть закрыт с помощью функции fclose ().
fclose(ifp);
fclose(ofp);
закрытие файла очень важно, особенно с выходными файлами. Причина в том, что выходные данные часто буферизуются. Это означает, что когда вы говорите C написать что-то, например,
fprintf(ofp, "Whatever!\n");
не обязательно сразу записываться на диск, но может оказаться в буфер в памяти. Этот выходной буфер будет содержать текст временно:
пример вывода буфера:
----------------------------------------------
| a | b | c | W | h | a | t | e | v | e | r |
----------------------------------------------
| ! | \n | | | | | | | | | |
----------------------------------------------
| | | | | | | | | | | |
----------------------------------------------
| | | | | | | | | | | |
----------------------------------------------
...
(буфер действительно просто 1-мерный, несмотря на этот рисунок.)
когда буфер заполняется (или когда файл закрыт), данные, наконец, записываются на диск.
- когда вы пишете в файл, вы сначала пишете в буфер, некоторые вызов функции flush и данные записываются в файл, но другие просто пишут в буфер. Когда буфер заполнен, он смывается на файл без прямого вызова Флеша. Вы также можете смывай, когда захочешь, если хочешь быть уверенным.
- и вы больше не можете использовать дескриптор файла после его закрытия.