2012-06-19 36 views
5

Tôi đang học một số chức năng tập tin và do đó có một nghi ngờ.Tại sao tôi phải sử dụng close() để đóng một tệp?

Tôi tò mò về lý do tại sao cần gọi close() để đóng tệp? Nếu tôi không gọi close() sau khi đọc/ghi một tệp, điều gì có thể xảy ra? Và nếu tôi gọi số close(), tôi vẫn có thể sử dụng bộ mô tả tệp không?

+1

Một loạt các câu trả lời dưới đây cho biết rằng() xóa bộ đệm vào đĩa. Tuy nhiên, close() là một hàm POSIX và không có điều nào đúng với POSIX close(). Nó chỉ phát hành khóa và giải phóng tài nguyên. –

Trả lời

7
  • Nếu tệp có bất kỳ loại đệm nào đằng sau nó và bạn không gọi gần thì bạn có thể mất dữ liệu.

  • Nếu hệ điều hành có tài nguyên giới hạn (ví dụ: số tệp đang mở) thì không đóng các tệp bạn đang lãng phí tài nguyên hệ thống.

  • Sử dụng một bộ mô tả một khi tập tin được đóng lại là vô nghĩa lúc tốt nhất, lỗi lớn lúc tồi tệ nhất (một chút như sử dụng bộ nhớ sau khi đã được giải phóng)

+4

Một số câu trả lời ở đây cho rằng các bộ đệm được xả khi đóng() nhưng thực tế là không đúng ... POSIX close() không xả và không có dấu hiệu về dữ liệu được ghi vào thiết bị hay không. –

2

Nếu bạn không đóng tệp nào được mở để đọc, nó có thể bị chặn để ghi đồng thời. Nếu bạn không đóng một tệp được mở để ghi - bạn có thể mất một phần dữ liệu được viết cuối cùng mà hệ điều hành lưu giữ trong bộ đệm.

Và không bao giờ sử dụng bộ mô tả của tệp đã đóng. Điều này không có ý nghĩa.

0

Khi bạn viết vào một tập tin sử dụng ghi () gọi hệ thống, nó không ghi ngay lập tức vào tập tin. Vì vậy, sau khi hoạt động của bạn, bạn phải gọi close() để bộ đệm được flushed vào tập tin và thay đổi vẫn tồn tại. Sau khi gọi close(), bạn không thể sử dụng bộ mô tả tập tin.

+4

write() sao chép dữ liệu từ không gian người dùng vào bộ đệm hệ thống. Các bộ đệm hệ thống sẽ được xóa khi thuận tiện của hệ thống hoặc khi đồng bộ(). close() có * không mang * khi xả bộ đệm. Nó chỉ giải phóng các khóa tập tin và giải phóng tài nguyên. –

0

Đóng tệp: Khi hoàn tất với một tệp, tệp phải được đóng bằng hàm fclose().

fclose(ifp); 
fclose(ofp); 

Đóng tệp là rất quan trọng, đặc biệt là với tệp đầu ra. Lý do là đầu ra thường được đệm. Điều này có nghĩa rằng khi bạn nói với C để viết một cái gì đó, ví dụ,

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

nó không cần thiết được ghi vào đĩa ngay lập tức, nhưng có thể kết thúc trong một đệm trong bộ nhớ. đệm đầu ra này sẽ giữ văn bản tạm thời:

mẫu đệm đầu ra:

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

(Bộ đệm là thực sự chỉ là 1 chiều mặc dù bản vẽ này.)

Khi bộ đệm đầy lên (hoặc khi tệp được đóng), dữ liệu cuối cùng được ghi vào đĩa.

Reference: http://www.cs.bu.edu/teaching/c/file-io/intro/

+2

Chỉnh sửa nhẹ. Câu trả lời của bạn _seems_ để chỉ ra rằng các tệp phải được đóng bằng 'fclose'. Bạn cũng có thể đóng các tệp bằng 'đóng'. Nó chỉ là 'fclose' lấy một con trỏ tập tin và' close' lấy một bộ mô tả tập tin. Ngoài ra, nhiều lần triển khai xóa bộ đệm khi chúng gặp phải ký tự dòng mới '\ n' –

+0

Cảm ơn bạn đã sửa chữa. :) – Hrishikesh

+0

Câu hỏi đặt ra là gần(), không phải fclose(). Không có gì bạn viết ở đây thực sự là đúng của close(). Và tuyên bố của Pavan có lẽ thậm chí còn tồi tệ hơn ... fopen cặp với fclose và mở (hoặc tạo) cặp với gần; sự khác biệt không chỉ là giữa các con trỏ tập tin và các bộ mô tả tập tin, nó nằm giữa các hàm trừu tượng/API hoàn toàn khác nhau (một trong số đó có thể xảy ra được thực hiện thông qua cái kia). –

2

Mức giá đóng cửa() chức năng đóng kết nối giữa chương trình và tập tin mở xác định bởi một tay cầm.Bất kỳ bộ đệm hệ thống bất thành văn đang đỏ mặt vào đĩa, và tài nguyên hệ thống được sử dụng bởi các tập tin được giải phóng

Phần in đậm là lý do chính tại sao một tập tin nên được đóng

Đóng một file có hậu quả sau đây:

1) Bộ mô tả tệp được deallocated.
2) Bất kỳ khóa ghi nào thuộc sở hữu của quá trình trên tệp đều được mở khóa.
3) Khi tất cả các mô tả tập tin liên kết với một đường ống hoặc FIFO đã bị đóng, mọi dữ liệu chưa đọc sẽ bị loại bỏ.

+1

+1 Đáng chú ý, đây là câu trả lời duy nhất ở đây mà không xác nhận sai lầm rằng gần() flushes dữ liệu. –

0
  • Khi bạn viết vào một tập tin bạn viết đầu tiên vào một bộ đệm, một số chức năng gọi tuôn ra và dữ liệu được ghi vào tập tin, nhưng người khác chỉ cần viết vào bộ đệm. Khi bộ đệm đầy, nó tuôn ra vào tập tin mà không có bất kỳ cuộc gọi trực tiếp nào để xả. Bạn cũng có thể tuôn ra bất cứ khi nào bạn muốn nếu bạn muốn chắc chắn.
  • Và bạn không thể sử dụng bộ mô tả tệp nữa sau khi bạn đóng nó.
Các vấn đề liên quan