2011-12-09 14 views
9

मैं जानना चाहता हूं कि फाइल बंद होने के बाद FILE सूचक के साथ क्या होता है। क्या यह शून्य होगा?फ़ाइल बंद होने के बाद फ़ाइल सूचक के साथ क्या होता है?

असल में, मैं यह जांचना चाहता हूं कि फ़ाइल बंद करने से पहले फ़ाइल को पहले ही बंद कर दिया गया है या नहीं।

उदाहरण के लिए इस प्रकार है:

FILE *f; 

if(f!=NULL) 
{ 
    fclose(f); 
} 

मैं यह कर या इसके बारे में जाने के लिए किसी अन्य तरीके से है सकते हैं?

उत्तर

10

चूंकि तर्क मूल्य से पारित होते हैं, इसलिए fclose आपके फ़ाइल सूचक को NULL पर सेट नहीं कर सकता है। चूंकि fclose शायद नष्ट कर देता है FILE आपके पास करने के लिए

  • मैन्युअल रूप से एक fclose (यदि आप इसे एक अलग समारोह में बंद unles आप FILE ** का उपयोग काम नहीं करेगा)
  • नहीं करने के बाद NULL करने के लिए फ़ाइल सूचक सेट एक स्थिति में समाप्त जहां "भूल" है कि क्या आप इसे बंद कर दिया है या नहीं (हो सकता है मुश्किल हो)
+0

उस स्थिति में, मैं यह कैसे पता लगा सकता हूं कि फ़ाइल पहले ही बंद हो चुकी है या नहीं। – CuriousCoder

+0

इसे बंद करने के बाद इसे 'NULL' पर सेट करें ... –

2

फ़ाइल * यह एक फ़ाइल संरचना करने के लिए एक सूचक है जब आप fclose (कहते हैं) यह नष्ट कर देगा/मुक्त फ़ाइल संरचना लेकिन FILE * सूचक का मान नहीं बदलेगा, इसका मतलब है कि अभी भी उस फ़ाइल संरचना का पता है जो अब बाहर नहीं है।

ही बातें किसी भी सूचक malloc

int a malloc(10); 
free(a); 

अभी भी साथ हो रही के साथ happem एक शून्य

सबसे मामले में नहीं होगा मैं हमेशा इस बातें

free(a); 
a=NULL; 

संपादित करें: आप नहीं कर सकते जांचें कि क्या यह किसी भी समय बंद/मुक्त है। बस यह सुनिश्चित करने के लिए कि आप इसे मुफ्त/fclose के बाद NULL असाइन कर सकते हैं ताकि आप इसकी नल की जांच कर सकें या आगे नहीं जा सकें ..

0

हाँ आप यह कर सकते हैं। और बेहतर तरीका fpNULL के लिए और

यह सूचक (एक सूचक जो कुछ की ओर इशारा करते है जो इसे का स्वामी नहीं है या जो मौजूद नहीं है)

5

Peter Norvig उद्धरण झूलते हो जाएगा स्थापित करने के लिए है Auguste Comte (1798-1857):

"Nothing is destroyed until it is replaced" 

आप मैक्रो इस्तेमाल कर सकते हैं:

#define fclose(fp) ((fp) ? fclose(fp) : 0, (fp) = 0) 
  • FILE * सूचक fclose के बाद NULL'd है, इसलिए यह fclose'd दो बार नहीं किया जा सकता: ६५१०४०३२१० यह दो अलग और विरोध करने की समस्याओं को ठीक करता।

  • fcloseका यह संस्करण एक पूर्ण तर्क स्वीकार करेगा। fclose के कई सामान्य संस्करण - जैसे एचपीयूएक्स, एसजीआई, और सीवाईजीविन में - एनयूएलएस के साथ खुश हैं। यह अजीब बात है कि लिनक्स, और माइक्रोसॉफ्ट जैसे फ्रीबीएसडी-प्रेरित संस्करण नहीं हैं।

बेशक

, मैक्रो अपनी ही समस्याओं का परिचय:

  • यह उचित त्रुटि मान वापस नहीं करता है। , if ((fclose)(fp) == EOF){ /* handle error... */ }

  • यह समारोह अर्थ विज्ञान नहीं है के रूप में यह अपने तर्क कई बार उपयोग करता है: लेकिन अगर आप इस देखना चाहता था, आप मैक्रो अतिरिक्त कोष्ठकों के साथ, के रूप में निष्क्रिय कर सकते हैं। लेकिन यह एक समस्या पैदा करने की कल्पना करना मुश्किल है। लेकिन आप (fclose) का उपयोग कर सकते हैं। या सम्मेलन का पालन करने के लिए इसे FCLOSE नाम दें।