सी

2010-01-15 2 views
6

में फ़ाइल से पढ़ने को रोकने के लिए कैसे मैं फ़ाइल के प्रत्येक चरित्र को पढ़ने की कोशिश कर रहा हूं और इसे प्रिंट कर रहा हूं लेकिन जब फ़ाइल पढ़ना समाप्त हो जाती है, लेकिन मुझे एक गुच्छा मिल रहा है? पढ़ने के बाद खत्म हो जाता है। मैं इसे कैसे ठीक करूं?सी

#include <stdio.h> 

int main(void){ 
    FILE *fr;   /* declare the file pointer */ 

    fr = fopen ("some.txt", "r"); /* open the file for reading */ 
     /* elapsed.dta is the name of the file */ 
     /* "rt" means open the file for reading text */ 
    char c; 
    while((c = getc(fr)) != NULL) 
    { 
     printf("%c", c); 
    } 
    fclose(fr); /* close the file prior to exiting the routine */ 
    /*of main*/ 


    return 0; 
} 
+0

क्या आपने सभी चेतावनियों को सक्षम करने के साथ संकलित करने का प्रयास किया है? मुझे लगता है कि आपका लूप सशर्त समस्या है, लेकिन मुझे यकीन नहीं है। अगर मैं सोच रहा हूं कि यह हो सकता है, तो अगर आप सभी चेतावनियों को सक्षम करते हैं तो संकलित हो जाएगा। –

+0

FILE के बारे में आपको जो कुछ जानने की आवश्यकता है वह यहां है: http://www.cplusplus.com/reference/clibrary/cstdio/FILE/ – Phong

+0

आपको 'getc()' के रिटर्न प्रकार के बारे में अधिक सावधान रहना चाहिए, और यह भी महसूस करना चाहिए कि 'न्यूल 'एक सूचक है। –

उत्तर

7

के खिलाफ जैसा कि इसके नाम के बावजूद बदल , getc एक int, नहीं एक char देता है, इतना है कि यह सभी संभावित चार मूल्यों का प्रतिनिधित्व कर सकते हैं और इसके अतिरिक्त, EOF (फ़ाइल का अंत)। यदि getc ने char लौटा दिया है, तो फ़ाइल में से किसी एक का उपयोग किए बिना फ़ाइल के अंत को इंगित करने का कोई तरीका नहीं होगा जो संभवतः फ़ाइल में हो सकता है।

तो, अपने कोड को ठीक करने के लिए, आपको पहले घोषणा char c; से int c; में बदलनी चाहिए ताकि यह वापस आने पर ईओएफ मार्कर को पकड़ सके। फिर, आपको NULL के बजाय EOF की जांच करने के लिए जबकि लूप स्थिति को भी बदलना होगा।

आप चरित्र पढ़ने से अलग फ़ाइल के अंत का परीक्षण करने के लिए feof(fr) पर भी कॉल कर सकते हैं। यदि आपने ऐसा किया है, तो आप c को char के रूप में छोड़ सकते हैं, लेकिन आपको चरित्र पढ़ने के बाद feof() पर कॉल करना होगा, लेकिन इससे पहले कि आप इसे मुद्रित करें, और लूप से बाहर निकलने के लिए break का उपयोग करें।

+2

'feof' का उपयोग करते समय सावधान रहें: http://c-faq.com/stdio/feof.html – jamesdlin

+0

@jamesdlin: चेतावनी के लिए धन्यवाद। – benzado

+1

नाइट: सी में, सादे 'char' पर हस्ताक्षर किए जा सकते हैं या हस्ताक्षर किए जा सकते हैं। ऊपर दिया गया आपका कथन सत्य है जब 'char' हस्ताक्षरित है, लेकिन यदि 'char' हस्ताक्षरित है, तो यह *' EOF' का प्रतिनिधित्व करने में सक्षम हो सकता है। आम तौर पर, 'ईओएफ' एक छोटा नकारात्मक स्थिरांक (उदाहरण के लिए -1) है, और इसे आसानी से' हस्ताक्षरित चार 'में दर्शाया जाता है। –

1
पर अंत फ़ाइल

fgetc() रिटर्न EOF, नहीं NULL

1

"ईओएफ" के साथ "पूर्ण" बदलें।

2

असफल, fgetc() ईओएफ देता है।

int c; 
while ((c = getc(fr)) != EOF) 
{ 
    printf("%c", c); 
} 
+0

सी को भी एक int के रूप में घोषित करने की आवश्यकता है। –

+0

@Emerick Rogul: क्या आप मूल प्रश्न के तहत उस टिप्पणी को चाहते हैं? –

1

बदलें इस

char c; 
while((c = getc(fr)) != NULL) 
{ 
    printf("%c", c); 
} 

char c; 
int charAsInt; 
while((charAsInt = getc(fr)) != EOF) 
{ 
    c = (char) charAsInt; 
    printf("%c", c); 
} 

को दूसरे शब्दों में: आप EOF, नहीं NULL खिलाफ तुलना की जरूरत है। fgetc से वापसी मूल्य प्राप्त करने के लिए आपको int चर का उपयोग करने की भी आवश्यकता है। यदि आप char का उपयोग करते हैं, तो EOF के साथ तुलना विफल हो सकती है, और आप वापस आ जाएंगे जहां आपने शुरुआत की थी।

+0

कई अन्य फ़ंक्शंस टाइप 'int' की अपेक्षा करते हैं, भले ही वे आमतौर पर केवल' char' की सीमा के भीतर काम करते हैं। 'Putchar',' isdigit', 'strchr' आदि – dreamlax

1

दूसरों ने पहले से ही आपके द्वारा उठाए गए मुद्दे को संबोधित किया है, लेकिन printf("%c", c); का उपयोग करने के बजाय यह शायद putchar(c); का उपयोग करने के लिए अधिक कुशल है। जब आप केवल एक वर्ण मुद्रित करने के लिए printf से पूछते हैं तो इसमें बहुत अधिक ओवरहेड शामिल होता है।

+0

सही है, लेकिन यह 'fgets' या' fscanf' के बजाय 'fgetc' का उपयोग करने के लिए है। –

+0

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

+1

'पुचर' के साथ 'getc' का उपयोग करना अधिक समझ में आता है क्योंकि एक व्यक्ति को' stdin' से एक वर्ण पढ़ने का इरादा है, और दूसरा एक वर्ण को 'stdout' में आउटपुट करना है। – dreamlax

1

getc एक पूर्णांक देता है।

चार सी, int c बदलें।

भी getc रिटर्न EOF, अपने परीक्षण शून्य के खिलाफ एक परीक्षण करने के लिए EOF