2012-06-19 2 views
5

Я изучаю некоторые функции файлов и, следовательно, сомневаюсь.Зачем использовать close() для закрытия файла?

Мне интересно, что вам нужно позвонить close(), чтобы закрыть файл? Если я не позвонил close() после прочтения/записи файла, что может случиться? И если я позвоню close(), могу ли я использовать дескриптор файла?

+1

Куча ответов ниже говорит, что close() сбрасывает буферы на диск. Однако close() является функцией POSIX, и это не относится к POSIX close(). Он только освобождает блокировки и освобождает ресурсы. –

ответ

7
  • Если у файла есть какая-то буферизация позади него, и вы не звоните близко, тогда вы можете потерять данные.

  • Если ОС имеет ограниченные ресурсы (например, количество открытых файлов), то, не закрывая файлы, вы тратите ресурсы системы.

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

+4

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

2

Если вы не закрываете файл, открытый для чтения, его можно заблокировать для одновременной записи. Если вы не закрываете файл, открытый для записи, вы можете потерять кусочек данных, записанных в буфере.

И никогда не используйте дескриптор уже закрытого файла. Это не имеет смысла.

0

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

+4

write() копирует данные из пользовательского пространства в системные буферы. Буферы системы будут очищены при удобстве системы или при синхронизации(). close() имеет * отсутствие подшипника * при промывке буферов. Он только освобождает блокировки файлов и освобождает ресурсы. –

0

Закрытие файла: Когда это делается с файлом, его необходимо закрыть с помощью функции fclose().

fclose(ifp); 
fclose(ofp); 

Закрытие файла очень важно, особенно с выходными файлами. Причина в том, что вывод часто буферизуется. Это означает, что когда вы говорите C, чтобы написать что-то, например,

fprintf(ofp, "Whatever!\n"); 

не нужно получить записываются на диск сразу, но может оказаться в буфере в памяти. Этот выходной буфер будет держать текст временно: выходной буфер

Пример:

---------------------------------------------- 
| a | b | c | W | h | a | t | e | v | e | r | 
---------------------------------------------- 
| ! | \n | | | | | | | | | | 
---------------------------------------------- 
| | | | | | | | | | | | 
---------------------------------------------- 
| | | | | | | | | | | | 
---------------------------------------------- 
... 

(Буфер действительно только 1-мерным, несмотря на этот рисунок.)

Когда буфер заполняется (или когда файл закрыт), данные, наконец, записываются на диск.

Ссылка: http://www.cs.bu.edu/teaching/c/file-io/intro/

+2

Небольшие исправления. Ваш ответ _seems_, чтобы указать, что файлы должны быть закрыты только с помощью 'fclose'. Вы также можете закрыть файлы с помощью 'close'. Его просто, что 'fclose' принимает указатель файла, а' close' принимает дескриптор файла. Кроме того, многие реализации стирают буфер, когда они сталкиваются с символом новой строки '\ n' –

+0

Спасибо за исправления. :) – Hrishikesh

+0

Вопрос о close(), а не fclose(). Ничто из того, что вы написали здесь, на самом деле верно для close(). И утверждение Павана, возможно, еще хуже ... fopen пары с fclose и open (или creat) пары с близкими; разница не только между указателями файлов и файловыми дескрипторами, но и между совершенно разными абстракциями/API (один из которых может быть реализован через другой). –

2

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

Bolded часть является главной причиной, почему файл должен быть закрыт

Закрытие файла имеет следующие последствия:

1) Дескриптор файла освобожден.
2) Любые блокировки записи, принадлежащие процессу в файле, разблокируются.
3) Когда все дескрипторы файлов, связанные с каналом или FIFO, были закрыты, любые непрочитанные данные отбрасываются.

+1

+1 Замечательно, это единственный ответ здесь, который не ошибочно утверждает, что close() сбрасывает данные. –

0
  • При записи в файл вы пишете первый в буфер, некоторые вызова функции флеша и данные записываются на файл, но других просто написать в буфер. Когда буфер заполнен, он сбрасывает в файл без прямого вызова флеша. Вы также можете использовать , если хотите, если хотите.
  • И после того, как вы его закрыли, вы больше не можете использовать дескриптор файла.
Смежные вопросы