2009-10-26 11 views
6

ईओएफ हमेशा नकारात्मक है?ईओएफ हमेशा नकारात्मक है?

मैं एक ऐसा फ़ंक्शन लिखने की सोच रहा हूं जो इनपुट में अगला शब्द पढ़ता है और इनपुट के अंत तक पहुंचने पर लाइन नंबर या ईओएफ में लाइन नंबर देता है। यदि ईओएफ आवश्यक रूप से नकारात्मक नहीं है, तो कार्य गलत होगा।

+1

आपको अपने स्वयं के फ़ंक्शन से ईओएफ वापस करने की आवश्यकता क्यों है? बस अपने फ़ंक्शन को परिभाषित करें "शब्द पंक्ति को लौटाता है जहां शब्द मिला था, या -1 यदि इनपुट का अंत पहुंचा था"। उस ने कहा, विफलता कोड के साथ वापसी मूल्यों के मिश्रण के खिलाफ कई स्रोत (उदा। कोड पूर्ण) सावधानी। –

+0

सही, यह एक संभावित और पूरी तरह व्यवहार्य विकल्प है। हालांकि, मैंने सोचा कि ईओएफ अधिक स्पष्ट होगा। – Ree

उत्तर

10

हां, ईओएफ हमेशा नकारात्मक होता है।

स्टैंडर्ड कहते हैं:

7,19 इनपुट/आउटपुट
7.19.1 परिचय

3 मैक्रो [रहे हैं ...] EOF जो एक पूर्णांक लगातार अभिव्यक्ति के लिए विस्तारित, प्रकार int और एक नकारात्मक मूल्य के साथ, कि कई कार्य द्वारा दिया जाता है अंत फ़ाइल से संकेत मिलता है, वह है, एक धारा से अधिक नहीं इनपुट ;

ध्यान दें कि "सादे" char पर हस्ताक्षर किए जाने में कोई समस्या नहीं है। <stdio.h> फ़ंक्शन जो char एस से निपटते हैं, विशेष रूप से वर्णों को unsigned char पर और फिर int पर डालें, ताकि सभी मान्य वर्णों का सकारात्मक मूल्य हो। उदाहरण के लिए:

int fgetc(FILE *stream) 

7.19.7.1
... fgetc समारोह एक अहस्ताक्षरित को पूर्णांक में परिवर्तित चार के रूप में है कि चरित्र ...

+3

यदि कोई आकार (char) == sizeof (int) 'है, तो एक समस्या है, हालांकि 'हस्ताक्षरित char' के माध्यम से भी कास्ट सभी वैध' char' मानों को सकारात्मक नहीं रखेगा। सौभाग्य से यह अपेक्षाकृत दुर्लभ है। –

+0

यह केवल एक समस्या है यदि आप गलत मान मानते हैं तो हमेशा EOF ('if (ch <0)/* EOF पता चला है * /;') या यदि "निष्पादन वर्ण सेट" सभी मानों का उपयोग 'INT_MIN' से' 0' इस मामले में 'ईओएफ' मान मान्य चरित्र के मान के समान है। – pmg

15

ईओएफ हमेशा == EOF है। कुछ और मत मानो।

मानक के दूसरे पढ़ने (और यहां कुछ अन्य टिप्पणियों के अनुसार) ऐसा लगता है कि ईओएफ हमेशा नकारात्मक है - और इस प्रश्न (लाइन नंबर या ईओएफ) में निर्दिष्ट उपयोग के लिए यह काम करेगा। मेरा मतलब है कि (और अभी भी) के खिलाफ चेतावनी देने का मतलब यह है कि पात्र सकारात्मक हैं और ईओएफ नकारात्मक है।

याद रखें कि एक मानक अनुरूप सी कार्यान्वयन के लिए ऋणात्मक चरित्र मान रखने के लिए यह संभव है - यह 'सी प्रोग्रामिंग भाषा' (के आर) में भी उल्लेख किया गया है। प्रिंटिंग वर्ण हमेशा सकारात्मक होते हैं, लेकिन कुछ आर्किटेक्चर (शायद सभी प्राचीन) पर, नियंत्रण वर्ण नकारात्मक होते हैं। सी मानक char प्रकार हस्ताक्षरित या हस्ताक्षरित नहीं है, और केवल एकमात्र वर्ण निरंतर प्लेटफ़ॉर्म पर समान मान रखने की गारंटी देता है, '\0' है।

+0

क्या आप कुछ संदर्भ जोड़ सकते हैं? – Guillaume

+6

यह सही नहीं है। ईओएफ मैक्रो ** ** को एक नकारात्मक पूर्णांक में विस्तारित करना चाहिए, दुर्भाग्यवश मेरे पास इस समय मानक की मेरी प्रति नहीं है। –

+0

सी लाइब्रेरी रेफरेंस, जो कहता है कि एएनएसआई सी मानक से इसकी लगभग सारी जानकारी लेती है, कहती है कि "ईओएफ एक नकारात्मक पूर्णांक है जो इंगित करता है कि एक अंत-फ़ाइल तक पहुंच गई है" (http: //www.acm .uiuc.edu/webmonkeys/पुस्तक/c_guide/2.12.html # चर)। उस ने कहा, मैं अभी भी कहूंगा कि यह खराब शैली है और इसके शीर्ष पर, ईओएफ मानने के लिए अनावश्यक है। –

8

कि समारोह वापसी

  • लाइन नंबर शब्द
  • या में पाया गया था -1 मामले में इनपुट के अंत तक पहुँच गया है

समस्या हल, एक आवश्यकता के बिना है किसी भी ईओएफ मूल्यों पर भरोसा करने के लिए। कॉलर एक सफल कॉल के लिए आसानी से अधिक या बराबर-शून्य के लिए परीक्षण कर सकता है, और अन्यथा ईओएफ/आईओ-त्रुटि मानता है।

+0

दरअसल, यह एक अच्छा विकल्प है। – Ree

1

ईओएफ एक मूल्य के बजाय एक शर्त है। इस सेंटीनेल का सटीक मूल्य कार्यान्वयन परिभाषित किया गया है। कई मामलों में, यह एक नकारात्मक संख्या है।

1

wikipedia से:

EOF के वास्तविक मूल्य एक प्रणाली पर निर्भर नकारात्मक संख्या, सामान्यतः -1, जो किसी भी मान्य वर्ण कोड के लिए असमान होने की गारंटी है।

लेकिन कोई संदर्भ ...

सुरक्षित कोडिंग से: Detect and handle input and output errors EOF नकारात्मक लेकिन केवल तभी जब sizeof(int) > sizeof(char) है।

+0

विकिपीडिया यहां पूरी तरह से सही नहीं है। ईओएफ -1 हो सकता है, और हस्ताक्षरित वर्णों के साथ एक चरित्र के मूल्य -1 हो सकता है (उदाहरण के लिए विंडोज़ -1252 में यूरो प्रतीक)। मामला यह है कि '(एफ) getc' का वापसी मूल्य अगले वर्ण को एक हस्ताक्षरित चार में डाला जाता है और फिर 'int' पर जाता है और यह' EOF' से मेल नहीं खाता है।बेशक यह केवल तभी काम कर सकता है जब 'sizeof (int)! = Sizeof (char) '। –

2

online draft n1256, 17.9.1.3 से प्राप्त :

EOF

जो टाइप इंट और ऋणात्मक मान, के साथ एक पूर्णांक स्थिर अभिव्यक्ति का विस्तार करता है जो कई कार्यों द्वारा अंत-फ़ाइल इंगित करने के लिए वापस किया जाता है, यानी, स्ट्रीम से इनपुट नहीं;

ईओएफ हमेशा नकारात्मक होता है, हालांकि यह हमेशा -1 नहीं हो सकता है।

इस तरह की समस्या के लिए, मैं फ़ंक्शन द्वारा दिया गया मान के रूप में एक त्रुटि कोड (SUCCESS, END_OF_FILE, READ_ERROR, आदि) लौट रहा है, और फिर इस तरह के रूप में अलग मानकों के हित के लिए डेटा लिख ​​कर डेटा से त्रुटि की स्थिति को अलग पसंद करते हैं

int getNextWord (FILE *stream, char *buffer, size_t bufferSize, int *lineNumber) 
{ 
    if (!fgets(buffer, bufferSize, stream)) 
    { 
    if (feof(stream)) return END_OF_FILE; else return READ_ERROR; 
    } 
    else 
    { 
    // figure out the line number 
    *lineNumber = ...; 
    } 
    return SUCCESS; 
}  
संबंधित मुद्दे