2012-08-23 14 views
6

संभव डुप्लिकेट:
“while(!feof(file))” is always wrongसी पढ़ने बाइनरी फ़ाइलें

अगर मैं आउटपुट फ़ाइल के लिए एक सरणी लिख सकते हैं और मैं फ़ाइल को बंद करें, उसके बाद फिर से फ़ाइल को खोलने और अंत तक सब कुछ पढ़ा फ़ाइल फ़ाइल तक पहुंच गई है, हालांकि फ़ाइल में केवल 4 नंबर हैं, प्रोग्राम 5 नंबर पढ़ और प्रिंट करेगा, क्यों?

कार्यक्रम उत्पादन:

a[0] = 4 
a[1] = 7 
a[2] = 12 
a[3] = 34 
a[4] = 34 

save.bin (एक हेक्स संपादक के साथ) immedately fread() करने के लिए कॉल के बाद फ़ाइल के अंत के लिए

04000000 07000000 0C000000 22000000 

#include <stdio.h> 
#include <stdlib.h> 
#define path "save.bin" 

int main(void) 
{ 
    FILE *f=NULL; 
    int a[]={4,7,12,34},i,n=4,k; 
    f=fopen(path,"wb"); 
    if(f==NULL) 
    { 
    perror("Error"); 
    exit(1); 
    } 
    for(i=0;i<n;i++) // or I could use fwrite(a,sizeof(int),n,f); 
    fwrite(&a[i],sizeof(int),1,f); 
    fclose(f); 
    f=fopen(path,"rb"); 
    if(f==NULL) 
    { 
    perror("Error"); 
    exit(1); 
    } 
    i=0; 
    while(!feof(f)) 
    { 
    fread(&k,sizeof(int),1,f); 
    printf("a[%d] = %d\n",i,k); 
    i++; 
    } 
    printf("\n"); 
    fclose(f); 
    return 0; 
} 
+0

बहुत बहुत धन्यवाद !!! 'Feof()' सेट किया गया है, यह समझाते हुए – Cristi

उत्तर

9

feof(fp) केवल तभी हो जाता है जब आप फ़ाइल के अंत को पढ़ते हैं तो केवल गलत हो जाता है (यानी शून्य-शून्य मान)। यह समझाया जाना चाहिए कि लूप को आपके द्वारा अपेक्षा की जाने वाली चीज़ों में से एक क्यों दर्ज किया जाता है।

documentation से:

The function feof() tests the end-of-file indicator for the stream 
    pointed to by stream, returning nonzero if it is set. The end-of- 
    file indicator can be cleared only by the function clearerr(). 

इसके अलावा पोस्ट पढ़ें: Why is “while (!feof (file))” always wrong?

+3

+1। – hmjd

1
while(!feof(f)) 
{ 
    fread(&k,sizeof(int),1,f); 
    printf("a[%d] = %d\n",i,k); /** THIS ASSUMES fread() WAS SUCCESSFUL. **/ 
    i++; 
} 

चेक याके वापसी मूल्य की जांच करें, जो आइटम को पढ़ने की संख्या देता है जो इस मामले में 1 होना चाहिए। पाश का एक संभावित पुनर्गठन:

while(1 == fread(&k,sizeof(int),1,f)) 
{ 
    printf("a[%d] = %d\n",i,k); 
    i++; 
} 

पाश की जांच feof() बाद EOF सुनिश्चित करने के लिए पहुँच गया था और पाश कुछ अन्य विफलता की वजह से खत्म नहीं हुई।

1

मैं भी एक ही समस्या है। इसके बजाय इसे आजमाएं:

i=0; 
    while(true) 
    { 
    fread(&k,sizeof(int),1,f); 
    if(feof(f)) 
     break; 

    printf("a[%d] = %d\n",i,k); 
    i++; 
    } 

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

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