सी/सी ++ में फ़ाइल * सूचक को घोषित करने और उपयोग करने का सही तरीका क्या है? क्या इसे वैश्विक या स्थानीय घोषित किया जाना चाहिए? क्या कोई अच्छा उदाहरण दिखा सकता है?सी/सी ++ में फ़ाइल * सूचक को घोषित करने और उपयोग करने का सही तरीका क्या है?
उत्तर
इससे कोई फर्क नहीं पड़ता कि यह स्थानीय या वैश्विक है या नहीं। फ़ाइल पॉइंटर के दायरे के उपयोग के साथ कुछ लेना देना नहीं है।
सामान्य रूप से, जितना संभव हो सके वैश्विक चर से बचने के लिए एक अच्छा विचार है।
#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;
}
यहाँ "ग में फ़ाइल कब" के लिए गूगल पर पहली हिट है
http://www.cs.bu.edu/teaching/c/file-io/intro/
यहाँ तीसरा है:
यहाँ कैसे input.txt
से output.txt
को कॉपी करने के लिए दिखा नमूना दिया गया है gamedev से अधिक सी ++ स्लंट
http://www.gamedev.net/reference/articles/article1127.asp
आप उस स्कोप में पॉइंटर घोषित करते हैं जिसकी आपको आवश्यकता है।
यह किसी अन्य की तरह साधारण पॉइंटर है।
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
}
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 घोषित करने के लिए अनुमति हो यदि आप चाहें तो किसी भी अन्य चर की तरह है, लेकिन यह अनुशंसित नहीं किया जा सकता है।
यह सी तरीका है। सी ++ इसका उपयोग कर सकता है, लेकिन मुझे लगता है कि ऐसा करने का एक और सी ++ दोस्ताना तरीका है। एक नोट के रूप में, जब मुझे सी/सी ++ चिह्नित किया जाता है, तो मुझे इससे नफरत है, क्योंकि सी और सी ++ एक ही भाषा नहीं हैं और समान कार्य नहीं करते हैं। सी ++ में सी चीजों को करने के लिए कई अलग-अलग तरीके हैं जिनके पास सी नहीं है, और सी ++ के संदर्भ में आपके लिए करना आसान हो सकता है लेकिन वैध सी नहीं हैं। इसलिए यह किसी भी भाषा के लिए काम करेगा, यह नहीं है कि आप चाहते हैं कि आप मुख्य रूप से सी ++ का उपयोग करें।
संपादित करें: कुछ त्रुटि जांच जोड़ा गया। हमेशा अपने कोड में त्रुटि जांच का उपयोग करें।
सबसे पहले, ध्यान रखें कि एक फ़ाइल सूचक (और संबद्ध आवंटित संरचना) निचले स्तर के खुले() पढ़ने() लिखने() कॉल पर आधारित है। संबंधित फाइल डिस्क्रिप्टर (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, आपको उस पॉइंटर तक पहुंचने के लिए कई मॉड्यूल की आवश्यकता है, इस मामले में आप इसे एक संरचना में डालने से बेहतर हैं जिसे पारित किया जा सकता है।
यदि इसकी आवश्यकता केवल एक मॉड्यूल में है, तो इसे मुख्य() में घोषित करने पर विचार करें और अन्य कार्यों को एक फ़ाइल सूचक को तर्क के रूप में स्वीकार करने दें। इसलिए, जब तक मॉड्यूल के भीतर आपके कार्यों में इतने सारे तर्क नहीं हैं कि कोई अन्य असहनीय होगा .. वैश्विक स्तर पर फ़ाइल सूचक घोषित करने का कोई कारण नहीं है।
कुछ लॉगिंग लाइब्रेरी इसे करते हैं, जिसकी मुझे परवाह नहीं है ... विशेष रूप से जब पुन: प्रवेश करने वाले कार्यों से निपटना होता है। सी के मोनोलिथिक नेमस्पेस को कभी न छोड़ें :)
- 1. TypeForwardedToAttribute का उपयोग करने का सही तरीका क्या है?
- 2. सी में पॉइंटर शुरू करने का सही तरीका क्या है?
- 3. scala.io.Source का उपयोग करने का सही तरीका क्या है?
- 4. बड़े ISTreams को प्रबंधित करने का सही तरीका क्या है?
- 5. जावास्क्रिप्ट टैग को प्रारूपित करने का सही तरीका क्या है?
- 6. एसएएसएस, मिश्रण को कॉल करने का सही तरीका क्या है?
- 7. एसपीओजे डायहार्ड को हल करने का सही तरीका क्या है?
- 8. जावा में प्रमाणीकृत एन्क्रिप्शन करने का सही तरीका क्या है?
- 9. क्या "इस" सूचक का उपयोग करने और इसका उपयोग नहीं करने के बीच कोई अंतर है?
- 10. विरासत और जेनेरिक का उपयोग कर जर्सी संसाधनों को व्यवस्थित करने का सही तरीका क्या है?
- 11. मीडिया नियंत्रक को डिस्कनेक्ट करने का सही तरीका क्या है?
- 12. PowerShell में त्रुटि प्रबंधन करने का सही तरीका क्या है?
- 13. @ सिंक्रनाइज़ का उपयोग करने का सही तरीका कौन सा है?
- 14. रेल में class_attribute प्रारंभ करने का सही तरीका क्या है?
- 15. चर घोषित करने का पाइथोनिक तरीका क्या है?
- 16. PHP में निर्भरता लोड करने का सही तरीका क्या है?
- 17. हेडर फ़ाइल में const std :: स्ट्रिंग करने का सही तरीका?
- 18. BeginInvoke को समाप्त करने का सही तरीका?
- 19. फोन नंबरों का प्रतिनिधित्व करने का सही तरीका क्या है?
- 20. जावा में संभावनाओं और पर्सेंट का प्रतिनिधित्व करने और कुशलतापूर्वक उपयोग करने का सही तरीका क्या है?
- 21. क्या httpwebrequest का निपटान करने का कोई सही तरीका है?
- 22. size_t प्रिंट करने के लिए printf का उपयोग करने का सही तरीका क्या है?
- 23. किसी फॉर्म का परीक्षण करने के लिए दायरता को अनुकरण करने का सही तरीका क्या है?
- 24. घड़ी_टी प्रिंट करने के लिए printf का उपयोग करने का सही तरीका क्या है?
- 25. क्या यह एकाधिक संग्रह लोड करने के लिए ThenFetch() का उपयोग करने का सही तरीका है?
- 26. मैनेशिया डेटाबेस बैकअप/पुनर्स्थापित करने का सही तरीका क्या है?
- 27. एरलांग इंडेंट करने का सही तरीका क्या है?
- 28. एच 2 बंद करने का सही तरीका क्या है?
- 29. क्या एमवीवीएम लागू करने का यह सही तरीका है?
- 30. क्वार्ट्ज.NET का निपटान करने का सही तरीका?