2011-04-15 20 views
20

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

एक उदाहरण दिखाने के लिए क्या मैं इसे थोड़ा और स्पष्ट करना मतलब है:

FILE* fp; //<-- this 
fp = fopen("datum.txt", "r"); 

while(!feof(...) //etc. 
+1

ध्यान दें कि ['! Feof (stream) 'हमेशा गलत है] (http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)। – pmg

उत्तर

24

इस एक कीवर्ड या सी के साथ फ़ाइलों को संभालने के लिए विशेष डेटा प्रकार है?

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

इसे पॉइंटर के रूप में क्यों परिभाषित किया जाता है?

एक संरचना के सूचक के साथ, आप इसे किसी फ़ंक्शन के पैरामीटर के रूप में पास कर सकते हैं। उदाहरण के लिए यह function(FILE* fp)

के रूप में fgets या fgetc स्वीकार करेगा, fopen फ़ंक्शन एक नए बनाए गए फ़ाइल संरचना में एक सूचक वापस करेगा, इस अप्रयुक्त व्यक्ति को यह नया सूचक निर्दिष्ट करने से उन्हें एक ही संकेत मिलेगा चीज़।

क्या इसमें फ़ाइल के भीतर और अन्य डेटा में एक स्ट्रीम है?

संरचना परिभाषा इसके विवरण से थोड़ा अधिक भ्रमित प्रतीत होता है। यह सीधे, मेरे stdio.h से लिया जाता है MinGW32 5.1.4

typedef struct _iobuf 
{ 
    char* _ptr; 
    int _cnt; 
    char* _base; 
    int _flag; 
    int _file; 
    int _charbuf; 
    int _bufsiz; 
    char* _tmpfname; 
} FILE; 

कौन सा यह पहले सुंदर टिप्पणी भी शामिल है से:

कुछ का मानना ​​है कि उनके सही मन में कोई भी नहीं का उपयोग करना चाहिए इस संरचना के आंतरिक।

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

उपर्युक्त चेतावनी पर ध्यान देना और चिंता न करें कि यह क्या करता है। :)

+0

मेरा पहला प्रश्न और एक अच्छा जवाब, आपके इनपुट के लिए धन्यवाद! यह वास्तव में कुछ चीजों को साफ़ करता है। – johnholtsdater

+2

आपको 'संरचना' को पास करने के लिए पॉइंटर की आवश्यकता नहीं है। संरचना को छिपाने का कारण यह सूचक है। यह 'निजी' वर्ग के सदस्यों को लागू करने का सी तरीका है। यह बिल्कुल सही है कि कोई भी संरचना का उपयोग करने की कोशिश नहीं करेगा, क्योंकि मानक संरचना को परिभाषित नहीं करता है, इसके लिए केवल इसके लिए एक सूचक की आवश्यकता होती है। जैसा कि पहले उल्लेख किया गया है - इसे ** ओपेक ** प्रकार कहा जाता है। – littleadv

+0

@littleadv मुझे आश्चर्य है कि [दो] (http://stackoverflow.com/a/5672769/5994041) कथन में से एक वास्तव में मानक में उपलब्ध 'FILE' के बारे में सच है। वैसे भी, 'फ़ाइल' सूचक का उल्लेख करने का कारण क्या होगा, फिर भी यह परिभाषित नहीं करना कि यह वास्तव में क्या है/यह कैसे व्यवहार करता है? अजीब लगता है, हेडर से फ़ंक्शन का उपयोग करने के बावजूद अभी तक हेडर उपलब्ध नहीं है? – KeyWeeUsr

2

यह एक कीवर्ड नहीं है, यह एएनएसआई सी मानक फाइलों के साथ काम करने के लिए के रूप में परिभाषित डेटा प्रकार है। यह आमतौर पर एक आंतरिक संरचना को इंगित करता है जो फ़ाइल और उसके वर्तमान राज्य को पुस्तकालय कार्यों में वर्णित करता है।

0

यह एक विशेष डेटा प्रकार है। इसमें एक फ़ाइल हैंडल के साथ-साथ विभिन्न स्टेडियो कॉल द्वारा आंतरिक रूप से उपयोग किए जाने वाले विभिन्न झंडे होते हैं। आपको वास्तव में यह जानने की आवश्यकता नहीं होगी कि इसमें क्या है, बस यह एक डेटा प्रकार है जिसे आप पास कर सकते हैं।

http://www.cplusplus.com/reference/clibrary/cstdio/FILE/

लेकिन अगर आप रुचि रखते हैं, यहाँ यह कैसा दिखाई देता है:

http://en.allexperts.com/q/C-1587/2008/5/FILE-Structure.htm

+0

इन लिंक के लिए धन्यवाद, मेरी इच्छा है कि मैं प्लस वन कर सकूं। – johnholtsdater

3

FILE एक टाइपिफ़ नाम के रूप में उपयोग किया जाने वाला एक पहचानकर्ता है, आमतौर पर struct के लिए। stdio पुस्तकालय आमतौर पर की तरह

typedef struct { 
    ... 
} FILE; 

कहीं कुछ है। FILE पॉइंटर्स से निपटने वाले सभी फ़ंक्शन ... के contens को जानते हैं और संरचना सदस्यों तक पहुंच सकते हैं। सी प्रोग्रामर को FILE संरचनाओं को बनाने और संचालित करने के लिए fopen, feof, ferror, ungetc आदि जैसे फ़ंक्शंस का उपयोग करना चाहिए। इस तरह के प्रकार ओपेक कहा जाता है (यानी आप उनके अंदर झुक नहीं सकते लेकिन एक्सेसर फ़ंक्शंस का उपयोग करना चाहिए)।

+0

यह अधिक समझ में आता है, मुझे नहीं पता था कि अपारदर्शी प्रकार पहले क्या थे। धन्यवाद! – johnholtsdater