2009-12-02 11 views
23

मेरे पास एक टेक्स्ट फ़ाइल है जिसमें प्रत्येक पंक्ति पर तार हैं। मैं पाठ फ़ाइल में प्रत्येक पंक्ति के लिए एक संख्या में वृद्धि करना चाहता हूं, लेकिन जब यह फ़ाइल के अंत तक पहुंच जाता है तो इसे स्पष्ट रूप से रोकने की आवश्यकता होती है। मैंने ईओएफ पर कुछ शोध करने की कोशिश की है, लेकिन वास्तव में इसका उपयोग नहीं किया जा सकता है।सी में एक पाठ फ़ाइल के माध्यम से चलाने के लिए ईओएफ का उपयोग कैसे करें?

मुझे लगता है कि मुझे थोड़ी देर की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि यह कैसे करें।

उत्तर

67

कैसे आप का पता लगाने के EOF क्या आप धारा को पढ़ने के लिए उपयोग कर रहे हैं पर निर्भर करता है: निर्धारित करने के लिए

function     result on EOF or error      
--------     ---------------------- 
fgets()     NULL 
fscanf()     number of succesful conversions 
          less than expected 
fgetc()     EOF 
fread()     number of elements read 
          less than expected 

चेक उचित हालत के लिए इनपुट कॉल का परिणाम ऊपर है, तो feof() फोन करता है, तो परिणाम वजह से था ईओएफ या कुछ अन्य त्रुटि मारने के लिए।

fgets() का उपयोग करना:

char buffer[BUFFER_SIZE]; 
while (fgets(buffer, sizeof buffer, stream) != NULL) 
{ 
    // process buffer 
} 
if (feof(stream)) 
{ 
    // hit end of file 
} 
else 
{ 
    // some other error interrupted the read 
} 

fscanf() का उपयोग करना:

char buffer[BUFFER_SIZE]; 
while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion 
{ 
    // process buffer 
} 
if (feof(stream)) 
{ 
    // hit end of file 
} 
else 
{ 
    // some other error interrupted the read 
} 

fgetc() का उपयोग करना:

int c; 
while ((c = fgetc(stream)) != EOF) 
{ 
    // process c 
} 
if (feof(stream)) 
{ 
    // hit end of file 
} 
else 
{ 
    // some other error interrupted the read 
} 

fread() का उपयोग करना:

char buffer[BUFFER_SIZE]; 
while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1 
                // element of size 
                // BUFFER_SIZE 
{ 
    // process buffer 
} 
if (feof(stream)) 
{ 
    // hit end of file 
} 
else 
{ 
    // some other error interrupted read 
} 

ध्यान दें कि फ़ॉर्म उन सभी के लिए समान है: पढ़ने के ऑपरेशन के परिणाम की जांच करें; अगर यह असफल रहा, तो ईओएफ की जांच करें। ,

while(!feof(stream)) 
{ 
    fscanf(stream, "%s", buffer); 
    ... 
} 

यह फार्म रास्ता लोगों को लगता है यह करता है काम नहीं करता है क्योंकि feof() तक के बाद आप का प्रयास किया है सच नहीं लौटेगा अंत अतीत को पढ़ने के लिए: आप की तरह उदाहरण के एक बहुत देखेंगे फाइल का नतीजतन, लूप एक बार बहुत अधिक निष्पादित करता है, जो आपको कुछ दुःख का कारण बन सकता है या नहीं।

+0

अच्छा, लेकिन इस लोकप्रिय उत्तर के कुछ सुझाव: 1) "फ़ंक्शन: 'fscanf()' ईओएफ या त्रुटि पर परिणाम: अपेक्षित से कम सफल रूपांतरणों की संख्या" इनपुट इनपुट समतुल्य "त्रुटि प्रारूप प्रारूप विफलताओं के साथ। सही समूह नहीं है आईएमओ। एक और कॉलम ओटीओएच का सुझाव दें यह एक जटिल कार्य है 2) वर्तनी जांच 3) 'जबकि (खराब फीड (स्ट्रीम))' उदाहरण पर "खराब कोड" टिप्पणी का सुझाव दें। – chux

10

एक संभव सी पाश होगा:

#include <stdio.h> 
int main() 
{ 
    int c; 
    while ((c = getchar()) != EOF) 
    { 
     /* 
     ** Do something with c, such as check against '\n' 
     ** and increment a line counter. 
     */ 
    } 
} 

अभी के लिए, मैं feof और इसी तरह के कार्यों की अनदेखी करेंगे। एक्सप्राइंस से पता चलता है कि इसे गलत समय पर कॉल करना बहुत आसान है और इस विश्वास में दो बार संसाधित करना है कि ईओएफ अभी तक नहीं पहुंचा है।

पिटफॉल से बचने के लिए: 0 के प्रकार के लिए char का उपयोग करना। getchar अगले चरित्र को unsigned char पर और फिर int पर लौटाता है। इसका मतलब यह है कि अधिकांश [साईं] प्लेटफ़ॉर्म पर EOF का मान औरमें मान्य "char" मान ओवरलैप नहीं करते हैं, इसलिए आप कभी भी 'सामान्य' char के लिए EOF का आकस्मिक रूप से पता नहीं लगाएंगे।

+0

थाट कभी भी काम नहीं करेगा, आपने परिभाषित नहीं किया है – streetparade

+1

मैं 'stdio.h शामिल हूं। –

+0

मेरा जवाब देखें मैंने एक eof – streetparade

0

आपको फ़ाइल से पढ़ने के बाद ईओएफ की जांच करनी चाहिए।

fscanf_s     // read from file 
while(condition)   // check EOF 
{ 
    fscanf_s    // read from file 
} 
संबंधित मुद्दे