सी

2010-12-05 4 views
45

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

सबसे पहले, मैं जानना चाहता हूं कि ईओएफ का मूल्य -1 क्यों है और getchar()!=EOF का मान 0 है। मेरे प्रश्न के लिए मुझे क्षमा करें लेकिन मैं वास्तव में समझ में नहीं आता हूं। मैंने वास्तव में कोशिश की लेकिन मैं नहीं कर सकता।

फिर मैंने पुस्तक पर उदाहरण चलाने की कोशिश की जो नीचे दिए गए कोड का उपयोग कर वर्णों की संख्या को गिन सकता है लेकिन ऐसा लगता है कि अगर मैं एंटर दबाता हूं तो भी मैं लूप से बाहर नहीं निकलता हूं इसलिए मैं सोच रहा हूं कि मैं कब पहुंचूंगा EOF?

main(){ 
    long nc; 
    nc = 0; 
    while (getchar() != EOF) 
     ++nc; 
    printf("%ld\n", nc); 
} 

फिर, मैंने Problem with EOF in C पर एक ही समस्या को पढ़ा। अधिकांश लोगों ने सलाह दी कि ईओएफ का उपयोग करने के बजाय, टर्मिनेटर \ n या नल टर्मिनेटर '\ 0' का उपयोग करें जो बहुत समझ में आता है।

क्या इसका मतलब यह है कि पुस्तक पर उदाहरण एक और उद्देश्य प्रदान करता है?

+5

आप समझते हैं कि किताब उल्लेख सी भाषा के मूल लेखकों द्वारा है, है ना? –

उत्तर

61

EOF इंगित करता है "फ़ाइल का अंत" से पढ़। एक नई लाइन (जो तब होता है जब आप एंटर दबाते हैं) फ़ाइल का अंत नहीं है, यह लाइन का अंत है, इसलिए एक नई लाइन इस लूप को समाप्त नहीं करती है।

कोड गलत नहीं है [*], यह ऐसा नहीं करता है जो आप अपेक्षा करते हैं। यह इनपुट के अंत तक पढ़ता है, लेकिन आप केवल एक पंक्ति के अंत तक पढ़ना चाहते हैं।

ईओएफ का मान -1 है क्योंकि इसे getchar से किसी भी वापसी मूल्य से अलग होना चाहिए जो एक वास्तविक चरित्र है। तो getchar किसी भी चरित्र मान को एक हस्ताक्षरित चार के रूप में लौटाता है, जो int में परिवर्तित होता है, जो इसलिए गैर-नकारात्मक होगा।

यदि आप टर्मिनल पर टाइप कर रहे हैं और आप एक अंत फ़ाइल को उत्तेजित करना चाहते हैं, तो CTRL-D (यूनिक्स-स्टाइल सिस्टम) या CTRL-Z (Windows) का उपयोग करें। फिर सभी इनपुट पढ़ने के बाद, getchar()EOF लौटाएगा, और इसलिए getchar() != EOF गलत होगा, और लूप समाप्त हो जाएगा।

[*] ठीक है, अगर यह पूर्णांक ओवरफ़्लो के कारण इनपुट LONG_MAX वर्णों से अधिक है, तो यह व्यवहार को अपरिभाषित करता है, लेकिन हम शायद इसे सरल उदाहरण में माफ कर सकते हैं।

+0

मुझे अब समस्या पता है .. यही कारण है कि मैं परिणाम नहीं देख सकता .. ऐसा इसलिए है क्योंकि मैं देव-सी ++ का उपयोग कर रहा हूं और इसमें कोई सिस्टम नहीं है ("रोकें") इसलिए मुझे इसे टाइप करने की आवश्यकता है कोड। – newbie

+2

वास्तव में CTRL + D एक ईओएफ को उत्तेजित नहीं करता है। यह सिर्फ आपके टर्मिनल को समाप्त करता है, जो बदले में कर्नेल को और बाइट्स नहीं पढ़ा जा सकता है, इसलिए मानक इनपुट फ़ाइल वर्णनात्मक में कोई डेटा उपलब्ध नहीं है। –

+0

@newbie 'system' फ़ंक्शन एक नया खोल बनाता है और इसे पास किया गया आदेश चलाता है। आदेश सिस्टम खोल द्वारा निष्पादित किया जाता है और संकलक से संबंधित नहीं है –

5

यह बहुत सारे प्रश्न हैं।

  1. क्यों EOF -1 है: आमतौर पर -1 कॉल POSIX प्रणाली में त्रुटि पर दिया जाता है, तो मैं लगता है कि विचार है

  2. किसी भी बूलियन आपरेशन (सहित "EOF त्रुटि की तरह है" =) यदि यह सत्य है, तो 0 लौटाता है, और यदि यह गलत है, तो getchar() != EOF0 है जब यह गलत है, जिसका अर्थ है getchar()EOF लौटा।

  3. क्रम में EOF अनुकरण करने के लिए जब stdin प्रेस Ctrl + D

+0

बूलियन ऑपरेशंस वापस ** गैर-शून्य ** सत्य के लिए और शून्य के लिए शून्य। एक अंतर है –

+7

नहीं, ऑपरेटरों को वापस लौटने के लिए परिभाषित किया गया है। कोई गैर-शून्य मान एक बूलियन संदर्भ में "सत्य" है (उदाहरण के लिए, एक 'if() 'या' जबकि() 'शर्त)। –

+0

यह 6.5.9/3 है। –

13

ईओएफ -1 है क्योंकि इस तरह यह परिभाषित किया गया है। यह नाम मानक लाइब्रेरी हेडर द्वारा प्रदान किया गया है कि आप #include।वे इसे -1 के बराबर बनाते हैं क्योंकि इसे ऐसा कुछ होना चाहिए जिसे वास्तविक बाइट getchar() द्वारा पढ़ा जा सके। getchar() सकारात्मक संख्या (0 तक 255 समावेशी) का उपयोग करके वास्तविक बाइट्स के मानों की रिपोर्ट करता है, इसलिए -1 इसके लिए ठीक काम करता है।

!= ऑपरेटर का अर्थ है "बराबर नहीं"। 0 झूठ के लिए खड़ा है, और कुछ भी सच के लिए खड़ा है। तो क्या होता है, हम getchar() फ़ंक्शन को कॉल करते हैं, और परिणाम -1 (ईओएफ) की तुलना करें। यदि परिणाम ईओएफ के बराबर नहीं था, तो परिणाम सत्य है, क्योंकि चीजें जो बराबर नहीं हैं बराबर नहीं हैं। यदि परिणाम ईओएफ के बराबर था, तो परिणाम गलत है, क्योंकि समान चीजें समान नहीं हैं (बराबर नहीं)।

getchar() पर कॉल EOF लौटाता है जब आप "फ़ाइल के अंत" तक पहुंचते हैं। जहां तक ​​सी का संबंध है, 'मानक इनपुट' (डेटा जो आप कमांड विंडो में टाइप करके अपने प्रोग्राम को दे रहे हैं) एक फ़ाइल की तरह है। बेशक, आप हमेशा अधिक टाइप कर सकते हैं, इसलिए आपको "मैं कर रहा हूं" कहने का एक स्पष्ट तरीका चाहिए। विंडोज सिस्टम पर, यह नियंत्रण-जेड है। यूनिक्स सिस्टम पर, यह नियंत्रण-डी है।

पुस्तक में उदाहरण "गलत" नहीं है। यह पर निर्भर करता है जो आप वास्तव में करना चाहते हैं। जब तक ईओएफ का मतलब है कि आप सबकुछ पढ़ते हैं, तब तक जब तक उपयोगकर्ता कहता है "मैं कर रहा हूं", और तब आप और नहीं पढ़ सकते हैं। '\ N' तक पढ़ना मतलब है कि आप इनपुट की एक पंक्ति पढ़ते हैं। जब तक आप उपयोगकर्ता को इनपुट टाइप करने की अपेक्षा नहीं करते हैं, तब तक पढ़ना एक बुरा विचार है, क्योंकि कमांड प्रॉम्प्ट पर कीबोर्ड के साथ इस बाइट को उत्पन्न करना मुश्किल या असंभव है :)

+0

नियंत्रण -2 या नियंत्रण-स्थान वास्तव में इसे बहुत आसानी से उत्पन्न करता है ... –