2012-06-19 11 views
5

मैं कुछ फाइल फ़ंक्शंस सीख रहा हूं और इसलिए इसमें कोई संदेह है।मुझे फ़ाइल बंद करने के लिए करीबी() का उपयोग क्यों करना है?

मुझे इस बारे में उत्सुकता है कि फ़ाइल को बंद करने के लिए close() पर कॉल करना आवश्यक क्यों है? अगर मैंने फाइल पढ़ने/लिखने के बाद close() पर फोन नहीं किया है, तो क्या हो सकता है? और अगर मैंने close() पर कॉल किया है, तो क्या मैं अभी भी फ़ाइल डिस्क्रिप्टर का उपयोग कर सकता हूं?

+1

नीचे दिए गए उत्तरों का एक गुच्छा कहता है कि बंद() डिस्क पर बफर फ्लश करता है। हालांकि, बंद() एक POSIX फ़ंक्शन है और ऐसी कोई चीज़ POSIX बंद() के बारे में सच नहीं है। यह केवल ताले जारी करता है और संसाधनों को मुक्त करता है। –

उत्तर

7
  • यदि फ़ाइल के पीछे किसी प्रकार का बफरिंग है और आप करीब कॉल नहीं करते हैं तो आप संभावित रूप से डेटा खो सकते हैं।

  • यदि ओएस में सीमित संसाधन हैं (उदा। खुली फाइलों की संख्या) तो फाइलों को बंद न करके आप सिस्टम संसाधनों को बर्बाद कर रहे हैं।

  • एक बार फ़ाइल बंद कर दिया है, जिसमें वर्णनकर्ता का उपयोग करना, सबसे अच्छे रूप में व्यर्थ है बड़े पैमाने पर बग सबसे खराब (स्मृति के बाद यह मुक्त किया जा चुका है का उपयोग कर की तरह एक सा)

+4

यहां कई उत्तरों का दावा है कि बफर को बंद() पर फ़्लश किया जाता है लेकिन वास्तव में यह सच नहीं है ... POSIX बंद() कोई फ्लशिंग नहीं करता है और डिवाइस पर डेटा लिखा गया है या नहीं, इस पर कोई असर नहीं पड़ता है। –

2

यदि आप पढ़ने के लिए खोला गया फ़ाइल बंद नहीं करते हैं तो इसे समवर्ती लिखने के लिए अवरुद्ध किया जा सकता है। यदि आप लिखने के लिए खोला गया फ़ाइल बंद नहीं करते हैं - तो आप बफर में ओएस रखे गए अंतिम-लिखित डेटा का एक टुकड़ा खो सकते हैं।

और पहले से बंद फ़ाइल की एक वर्णक का उपयोग कभी नहीं करें। इसका कोई मतलब नहीं है।

0

जब आप लिखने का उपयोग कर एक फ़ाइल पर लिखने () सिस्टम कॉल, यह फ़ाइल को तुरंत लिखता नहीं है। तो आपके परिचालन के बाद, आपको करीब() को कॉल करना होगा ताकि बफर फ़ाइल में फंस जाए और परिवर्तन जारी रहे। क्लोज़() को कॉल करने के बाद, आप फ़ाइल डिस्क्रिप्टर का उपयोग नहीं कर सकते हैं।

+4

लिखें() उपयोगकर्ता स्थान से सिस्टम बफर में डेटा कॉपी करता है। सिस्टम बफर सिस्टम की सुविधा या सिंक() पर फ़्लश किए जाएंगे। बफर के फ्लशिंग पर बंद() * कोई असर नहीं है *। यह केवल फाइल ताले को मुक्त करता है और संसाधनों को जारी करता है। –

0

फ़ाइल बंद करना: फ़ाइल के साथ किए जाने पर, इसे फ़ंक्शन fclose() का उपयोग करके बंद किया जाना चाहिए।

fclose(ifp); 
fclose(ofp); 

फ़ाइल बंद करना बहुत महत्वपूर्ण है, खासकर आउटपुट फाइलों के साथ। कारण यह है कि आउटपुट अक्सर buffered है। इसका मतलब यह है कि जब आप सी बता कुछ को लिखने के लिए, उदाहरण के लिए,

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' के साथ बंद किया जाना चाहिए। आप 'करीबी' के साथ भी फाइल बंद कर सकते हैं। यह सिर्फ 'fclose' फ़ाइल सूचक में लेता है और' बंद 'फ़ाइल डिस्क्रिप्टर लेता है। साथ ही, कई कार्यान्वयन बफर को फ्लश करते हैं जब उन्हें एक न्यूलाइन वर्ण '\ n' –

+0

सुधारों के लिए धन्यवाद मिलता है। :) – Hrishikesh

+0

प्रश्न करीब(), fclose() नहीं है। यहां कुछ भी नहीं लिखा है जो वास्तव में करीब() है। और पवन का बयान शायद और भी बदतर है ... फोकस जोड़े और खुले (या रचना) जोड़े के साथ जोड़े जोड़े; अंतर केवल फाइल पॉइंटर्स और फ़ाइल डिस्क्रिप्टर के बीच नहीं है, यह काफी भिन्न abstractions/APIs के बीच है (जिनमें से एक दूसरे के माध्यम से लागू किया जा सकता है)। –

2

पास() फ़ंक्शन कार्यक्रम और एक खुले फ़ाइल एक हैंडल से पहचान के बीच संबंध बंद कर देता है।किसी भी अलिखित प्रणाली बफ़र्स डिस्क पर प्लावित कर रहे हैं, और सिस्टम संसाधन फ़ाइल द्वारा उपयोग जारी कर रहे हैं

बोल्ड हिस्सा प्रधानमंत्री कारण है कि एक फ़ाइल बंद किया जाना चाहिए

बंद करने पर एक फ़ाइल में निम्न परिणाम है है:

1) फ़ाइल डिस्क्रिप्टर को हटा दिया गया है।
2) फ़ाइल पर प्रक्रिया के स्वामित्व वाले किसी भी रिकॉर्ड लॉक अनलॉक हैं।
3) जब किसी पाइप या फीफो से जुड़े सभी फ़ाइल डिस्क्रिप्टर बंद कर दिए गए हैं, तो कोई अपठित डेटा त्याग दिया जाता है।

+1

+1 उल्लेखनीय रूप से, यह एकमात्र उत्तर है जो गलती से उस बंद() फ्लश डेटा पर जोर नहीं देता है। –

0
  • जब आप किसी फ़ाइल आप एक बफर में पहले लिखने में लिखते हैं, कुछ समारोह फ्लश कॉल और डेटा फ़ाइल के लिए पर लिखा है, लेकिन दूसरों बफर में लिखें। जब बफर भर जाता है तो यह फ्लैश के लिए सीधे कॉल के बिना फ़ाइल पर फ़्लश करता है। जब भी आप सुनिश्चित करना चाहते हैं तो आप फ्लश भी कर सकते हैं।
  • और आप इसे बंद करने के बाद फ़ाइल डिस्क्रिप्टर का उपयोग नहीं कर सकते हैं।