2014-04-20 6 views
6

पढ़ता है मेरे पास टेक्स्ट फ़ाइल (num.txt) से पढ़ने के लिए निम्न सरल प्रोग्राम है। पाठ फ़ाइल में प्रत्येक पंक्ति में संख्या 1 2 3 4 5 है। जब मैं प्रोग्राम चलाता हूं, तो यह 5 बार प्रिंट करता है। क्या कोई मुझे बता सकता है कि यह क्यों हो रहा है, और इसे कैसे ठीक किया जाए? अग्रिम धन्यवादfscanf अंतिम पूर्णांक को दो बार

int main(void) 
{ 
    int number; 
    FILE *file; 

    int i = 0;; 

    file = fopen("num.txt", "r"); 

    while (!feof(file)){ 

     fscanf(file, "%d", &number); 
     printf("%d\n", number); 
     } 

    return 0; 
} 

यहाँ मेरी पाठ फ़ाइल num.xtx

1 
2 
3 
4 
5 

है और यहाँ कार्यक्रम उत्पादन

1 
2 
3 
4 
5 
5 

नहीं है एक अतिरिक्त 5

+0

'जबकि (! Feof (फाइल)) {' :: feof() समस्या – wildplasser

+3

मेरा सुझाव है मई आप पढ़ सकते हैं [इस] (का कारण है http://stackoverflow.com/questions/5431941/ जबकि-feof-फ़ाइल-है-हमेशा गलत)? – niklasfi

+1

जब आप पिछले 5 को देखते हैं तो fscanf द्वारा दिया गया मान क्या है? मैं शर्त लगा रहा हूं कि यह 1 नहीं है ;-) –

उत्तर

7

कार्यों का scanf परिवार के आदमी पृष्ठ से,

मूल्य EOF यदि इनपुट के अंत से पहले या तो पहली सफल रूपांतरण या उससे मिलते-जुलते विफलता होता है तक पहुँच जाता है लौटाया जाता है। EOF भी पढ़ा गया त्रुटि होने पर भी लौटाया जाता है, इस स्थिति में त्रुटि के लिए त्रुटि संकेतक सेट है, और errno त्रुटि इंगित करने के लिए सेट है।

इसका मतलब यह है कि पिछले सफल fscanf कॉल धारा file जिसके बाद while पाश हालत !feof(file) सच है क्योंकि फ़ाइल हालत के अंत अभी तक नहीं मिले है से अंतिम पंक्ति पढ़ता है। इसका अर्थ यह है कि लूप को एक अतिरिक्त समय निष्पादित किया जाता है और चर के number के पिछले मान को फिर से मुद्रित किया जाता है।

कृपया इस पढ़ें - while(!feof(file)) is always wrong

आप फ़ाइल धारा पर फ़ाइल सूचक के अंत की जाँच के बजाय scanf की वापसी मान की जाँच करनी चाहिए।

#include <stdio.h> 

int main(void) { 
    int number; 
    FILE *file = fopen("num.txt", "r"); 

    // check file for NULL in case there 
    // is error in opening the file 
    if(file == NULL) { 
     printf("error in opening file\n"); 
     return 1; 
    }  

    // check if fscanf call is successful 
    // by checking its return value for 1. 
    // fscanf returns the number of input 
    // items successfully matched and assigned 
    while(fscanf(file, "%d", &number) == 1) 
     printf("%d\n", number); 

    return 0; 
} 
4

दूसरी बार fscanf में विफल रहा है और number पर कुछ भी नहीं लिखा, यही कारण है कि यह अभी भी 5 से है पिछली बार। यह जानने के लिए कि fscanf सफल हुआ है, तो आपको इसके वापसी मूल्य की जांच करनी होगी।

fscanf यह लिखा गया तर्कों की संख्या देता है। आपके मामले में, यदि यह 1 लौटाता है, तो यह काम करता है; अगर यह 0 लौटाता है, तो ऐसा नहीं हुआ। feof के बजाय आपको यह जांचना चाहिए।

while (fscanf(file, "%d", &number) == 1) 
{ 
    printf("%d\n", number); 
} 
संबंधित मुद्दे