2009-02-26 25 views
8

सी/सी ++ में फ़ाइल * सूचक को घोषित करने और उपयोग करने का सही तरीका क्या है? क्या इसे वैश्विक या स्थानीय घोषित किया जाना चाहिए? क्या कोई अच्छा उदाहरण दिखा सकता है?सी/सी ++ में फ़ाइल * सूचक को घोषित करने और उपयोग करने का सही तरीका क्या है?

उत्तर

17

इससे कोई फर्क नहीं पड़ता कि यह स्थानीय या वैश्विक है या नहीं। फ़ाइल पॉइंटर के दायरे के उपयोग के साथ कुछ लेना देना नहीं है।

सामान्य रूप से, जितना संभव हो सके वैश्विक चर से बचने के लिए एक अच्छा विचार है।

#include <stdio.h> 
int main (void) { 
    FILE *fin; 
    FILE *fout; 
    int c; 

    fin = fopen ("input.txt", "r"); 
    if (fin != NULL) { 
     fout = fopen ("output.txt", "w"); 
     if (fout != NULL) { 
      c = fgetc (fin); 
      while (c >= 0) { 
       fputc (c, fout); 
       c = fgetc (fin); 
      } 
      fclose (fout); 
     } else { 
      fprintf (stderr, "Cannot write to output.txt"); 
     } 
     fclose (fin); 
    } else { 
     fprintf (stderr, "Cannot read from input.txt"); 
    } 
    return 0; 
} 
1

यहाँ "ग में फ़ाइल कब" के लिए गूगल पर पहली हिट है

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

यहाँ तीसरा है:

यहाँ कैसे input.txt से output.txt को कॉपी करने के लिए दिखा नमूना दिया गया है gamedev से अधिक सी ++ स्लंट

http://www.gamedev.net/reference/articles/article1127.asp

आप उस स्कोप में पॉइंटर घोषित करते हैं जिसकी आपको आवश्यकता है।

4

यह किसी अन्य की तरह साधारण पॉइंटर है।

FILE *CreateLogFile() 
{ 
    return fopen("logfile.txt","w"); // allocates a FILE object and returns a pointer to it 
} 

void UsefulFunction() 
{ 
    FILE *pLog = CreateLogFile(); // it's safe to return a pointer from a func 
    int resultsOfWork = DoSomeWork(); 
    fprintf(pLog, "Work did %d\n", resultsOfWork); // you can pass it to other functions 
    fclose(pLog); // just be sure to clean it up when you are done with fclose() 
    pLog = NULL; // and it's a good idea to overwrite the pointer afterwards 
        // so it's obvious you deleted what it points to 
} 
1
int main(void) 
{ 
    char c; 
    FILE *read; 
    read = fopen("myfile", "r"); // opens "myfile" for reading 
    if(read == NULL) 
    { 
    perror("Error: could not open \"myfile\" for reading.\n"); 
    exit(1); 
    } 
    c = fgetc(read); 
    fclose(read); 
    printf("The first character of myfile is %c.\n", c); 
    return 0; 
} 

आप पूरी तरह से, वैश्विक filehandles घोषित करने के लिए अनुमति हो यदि आप चाहें तो किसी भी अन्य चर की तरह है, लेकिन यह अनुशंसित नहीं किया जा सकता है।

यह सी तरीका है। सी ++ इसका उपयोग कर सकता है, लेकिन मुझे लगता है कि ऐसा करने का एक और सी ++ दोस्ताना तरीका है। एक नोट के रूप में, जब मुझे सी/सी ++ चिह्नित किया जाता है, तो मुझे इससे नफरत है, क्योंकि सी और सी ++ एक ही भाषा नहीं हैं और समान कार्य नहीं करते हैं। सी ++ में सी चीजों को करने के लिए कई अलग-अलग तरीके हैं जिनके पास सी नहीं है, और सी ++ के संदर्भ में आपके लिए करना आसान हो सकता है लेकिन वैध सी नहीं हैं। इसलिए यह किसी भी भाषा के लिए काम करेगा, यह नहीं है कि आप चाहते हैं कि आप मुख्य रूप से सी ++ का उपयोग करें।

संपादित करें: कुछ त्रुटि जांच जोड़ा गया। हमेशा अपने कोड में त्रुटि जांच का उपयोग करें।

0

सबसे पहले, ध्यान रखें कि एक फ़ाइल सूचक (और संबद्ध आवंटित संरचना) निचले स्तर के खुले() पढ़ने() लिखने() कॉल पर आधारित है। संबंधित फाइल डिस्क्रिप्टर (fileno (file_pointer) द्वारा प्राप्त किया गया सबसे कम दिलचस्प बात है, लेकिन कुछ ऐसा हो सकता है जिसके साथ आप अपना दायरा देखना चाहें।

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

के लिए उदाहरण के लिए, (बुरा)

#include <stdio.h> 
#include ... 

#define MY_LOG_FILE "file.txt" 

FILE *logfile 

बेहतर किया है:

+०१२३५१६४१०६
#include <stdio.h> 

#define MY_LOG_FILE "file.txt" 

static FILE *logfile; 

int main(void) 
{ 

UNLESS, आपको उस पॉइंटर तक पहुंचने के लिए कई मॉड्यूल की आवश्यकता है, इस मामले में आप इसे एक संरचना में डालने से बेहतर हैं जिसे पारित किया जा सकता है।

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

कुछ लॉगिंग लाइब्रेरी इसे करते हैं, जिसकी मुझे परवाह नहीं है ... विशेष रूप से जब पुन: प्रवेश करने वाले कार्यों से निपटना होता है। सी के मोनोलिथिक नेमस्पेस को कभी न छोड़ें :)

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