2010-12-27 12 views
6

सी में जब हम एक फाइल खोलते हैं तो क्या होता है ?? जैसा कि मुझे पता है कि फ़ाइल खोलने पर फ़ाइल की सामग्री स्मृति में लोड नहीं होती है। यह सिर्फ फाइल डिस्क्रिप्टर सेट करता है? तो फिर यह फ़ाइल वर्णनकर्ता क्या है ?? और अगर फ़ाइल की सामग्री मेमोरी में लोड नहीं होती है तो फाइल कैसे खोली जाती है?सी में एक फाइल खोलना क्या है?

+2

क्या समारोह फ़ाइल खोलने के लिए उपयोग कर रहे हैं? – Thanatos

उत्तर

2

सी फ़ाइल I/O के लिए कोई प्राइमेटिव नहीं है, यह सब ऑपरेटिंग सिस्टम और आप कौन सी लाइब्रेरी का उपयोग कर रहे हैं, इस पर निर्भर करता है।

+2

'fopen' फ़ाइल I/O के लिए सी का आदिम है, और ओएस निर्भर नहीं है। (हालांकि आप अक्सर अधिक नियंत्रण के लिए ओएस विशिष्ट कार्यों को कॉल कर सकते हैं।) – Thanatos

+1

यह पूरी तरह से सही नहीं है। 'fopen' एक लाइब्रेरी फ़ंक्शन है, न कि आदिम। साथ ही, चूंकि फ़ाइल एक्सेस हमेशा ओएस द्वारा किया जाता है, इसलिए 'फॉपेन' वास्तव में ओएस निर्भर है। एक ओएस 'fopen' पर आगे या बफर लिखने में सक्षम हो सकता है, दूसरे पर यह शायद नहीं हो सकता है। –

+0

न केवल वह, लेकिन स्ट्रिंग फॉपेन का प्रारूप पूरी तरह से ओएस निर्भर है। तीन लोकप्रिय विकल्प/\ या: – ddyer

1

फ़ाइल वर्णनकर्ता केवल सार तत्व हैं। सब कुछ ऑपरेटिंग सिस्टम पर किया जाता है।

0

जैसा कि पहले ही उल्लेख किया गया है कि यह ओएस कार्यक्षमता है।

लेकिन सी फ़ाइल I/O के लिए शायद आपको fopen फ़ंक्शन पर जानकारी चाहिए।

आपको लगता है कि समारोह के लिए विवरण की जाँच करेगा, तो यह कहते हैं:

विवरण:

एक धारा को खोलता है।

fopen फ़ाइल नाम द्वारा फ़ाइल खोलता है और के साथ एक स्ट्रीम को संबद्ध करता है। बाद में संचालन में स्ट्रीम की पहचान करने के लिए fopen का उपयोग करने के लिए एक पॉइंटर लौटाता है।

तो सफल समापन पर fopen बस नई खुली धारा में एक सूचक लौटाता है। और यह किसी भी त्रुटि के मामले में शून्य लौटाता है।

6

आमतौर पर, अगर आप (एक POSIX सिस्टम पर) fopen या के साथ एक फ़ाइल खोल रहे हैं open, समारोह, यदि सफल, "फ़ाइल को खोलने" होगा - यह केवल आप एक मूल्य देता है (एक FILE * या एक int) भावी कॉल में पढ़ने के लिए उपयोग करने के लिए।

हुड के तहत, ऑपरेटिंग सिस्टम कुछ या सभी फ़ाइल को पढ़ सकता है, ऐसा नहीं हो सकता है। डेटा को किसी भी तरह से पढ़ने के अनुरोध के लिए आपको कुछ फ़ंक्शन कॉल करना होगा, और यदि आपने fread/fgets/read/आदि पर कॉल करते समय इसे नहीं किया है ... तो यह उस बिंदु पर होगा।

ए "फ़ाइल डिस्क्रिप्टर" आमतौर पर POSIX सिस्टम में open द्वारा लौटा पूर्णांक को संदर्भित करता है। इसका उपयोग एक खुली फ़ाइल की पहचान के लिए किया जाता है। यदि आपको कोई मूल्य मिलता है, तो कहीं भी ऑपरेटिंग सिस्टम ट्रैक रखता है कि 3/home/user/dir/file.txt, या जो कुछ भी संदर्भित करता है। ओएस को इंगित करने के लिए यह एक छोटा सा मूल्य है जो पढ़ने के लिए फ़ाइल है। जब आप open पर कॉल करते हैं, और कहें, foo.txt, ओएस कहता है, "ठीक है, फ़ाइल खोलें, इसे पर यहां से कॉल करें"।

1

कार्यक्रम का उपयोग करता है fopen() तो एक बफरिंग पैकेज एक फ़ाइल वर्णनकर्ता प्राप्त करने के लिए एक कार्यान्वयन विशेष सिस्टम कॉल का उपयोग करेगा और यह एक FILE संरचना में संग्रहीत होगा।

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

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

4

यह प्रश्न प्रोग्रामिंग भाषा से पूरी तरह से संबंधित नहीं है। यद्यपि लाइब्रेरी का प्रभाव होता है कि फ़ाइल खोलते समय क्या होता है (उदाहरण के लिए open या fopen का उपयोग करके), मुख्य व्यवहार ऑपरेटिंग सिस्टम से आता है।

लिनक्स, और मुझे लगता है कि ज्यादातर ओएस ज्यादातर मामलों में आगे पढ़ते हैं। इसका अर्थ यह है कि फ़ाइल के लिए read पर कॉल करने से पहले फ़ाइल वास्तव में भौतिक संग्रहण से पढ़ी जाती है। यह ऑप्टिमाइज़ेशन के रूप में किया जाता है, जब फ़ाइल को वास्तव में उपयोगकर्ता द्वारा पढ़ा जाता है तो पढ़ने के लिए समय कम कर देता है। खुले कार्यों के लिए विशिष्ट ध्वज का उपयोग करके, इस व्यवहार को प्रोग्रामर द्वारा आंशिक रूप से नियंत्रित किया जा सकता है। उदाहरण के लिए, Win32 API CreateFile क्रमशः यादृच्छिक पहुंच निर्दिष्ट करने के लिए FILE_FLAG_RANDOM_ACCESS या FILE_FLAG_SEQUENTIAL_SCAN निर्दिष्ट कर सकता है (जिस स्थिति में फ़ाइल आगे नहीं पढ़ी जाती है) या अनुक्रमिक पहुंच (जिस स्थिति में ओएस आगे आक्रामक पढ़ेगा) क्रमशः। अन्य ओएस एपीआई कम या ज्यादा नियंत्रण दे सकते हैं।

open, read, write है कि एक फ़ाइल वर्णनकर्ता का उपयोग के बुनियादी एएनएसआई सी एपीआई के लिए, फ़ाइल वर्णनकर्ता एक सरल पूर्णांक है कि ओएस पर पारित और फ़ाइल का प्रतीक रहा है। ओएस में स्वयं को अक्सर कुछ संरचनाओं में अनुवादित किया जाता है जिसमें फ़ाइल (नाम, पथ, ऑफ़सेट, आकार, पढ़ने और लिखने वाले बफर इत्यादि) के लिए सभी आवश्यक जानकारी शामिल होती है। ओएस फ़ाइल खोल देगा - जिसका अर्थ है विशिष्ट फाइल सिस्टम एंट्री (inode लिनक्स के तहत) जो open विधि में दिए गए पथ से संबंधित है, फ़ाइल संरचना बनाता है और उपयोगकर्ता को एक आईडी - फ़ाइल डिस्क्रिप्टर देता है। ओएस पर उस बिंदु से, जो भी डेटा उपयुक्त लगता है उसे पढ़ने के लिए स्वतंत्र है, भले ही उपयोगकर्ता द्वारा अनुरोध नहीं किया गया हो (अनुरोध किए गए अनुरोध से अधिक पढ़ना अक्सर कम से कम फ़ाइल सिस्टम मूल आकार में काम करने के लिए किया जाता है)।

0

जब आप फ़ाइल को खोलने तो फ़ाइल सूचक कि file.Then आप फ़ाइल पर काम करने के लिए विभिन्न कार्यों का उपयोग की आधार पते (शुरू करने का पता) हो जाता है। संपादित करें: क्रिस के लिए धन्यवाद, यहाँ है संरचना जो फ़ाइल का नाम है

typedef struct { 
     int    level;  /* fill/empty level of buffer */ 
     unsigned  flags;  /* File status flags   */ 
     char   fd;   /* File descriptor   */ 
     unsigned char hold;  /* Ungetc char if no buffer */ 
     int    bsize;  /* Buffer size    */ 
     unsigned char *buffer; /* Data transfer buffer  */ 
     unsigned char *curp;  /* Current active pointer  */ 
     unsigned  istemp;  /* Temporary file indicator */ 
     short   token;  /* Used for validity checking */ 
}  FILE; 
+0

बिल्कुल नहीं। एक स्ट्रीम में "फ़ाइल सूचक" (जो एक शाब्दिक फ़ाइल या कुछ और हो सकता है) वास्तव में फ़ाइल के डेटा के लिए सूचक नहीं है, बल्कि इसके बजाय एक संरचना के लिए एक सूचक है जो अंतर्निहित फ़ाइल वर्णनकर्ता और पढ़ने सहित पहुंच जानकारी संग्रहीत करता है सूचक। पठन सूचक आमतौर पर फ़ाइल की शुरुआत में शुरू किया जाएगा। लेकिन fopen() फ़ंक्शन संरचना में पॉइंटर देता है, न कि फ़ाइल में डेटा के लिए। फ़ाइल के डेटा में एक वास्तविक dereferencable सूचक प्राप्त करने के लिए, फ़ाइल डिस्क्रिप्टर (fopen() के बजाय) और फिर mmap() को पाने के लिए खोलें() का उपयोग करें। –

+0

फ़ाइल संरचनाएं ओएस निर्भर हैं। कुछ संरचनाओं में फ़ाइल की शुरुआत के लॉजिकल सेक्टर और प्लैटर नंबर हो सकते हैं। अन्य में अनुमतियां और फ़ाइल का नाम हो सकता है। –

संबंधित मुद्दे