2013-01-21 7 views
5

यह उदाहरण कश्मीर & आर पुस्तकgetchar() केवल एक पंक्ति की शुरुआत में ईओएफ को क्यों पहचानता है?

#include<stdio.h> 


main() 
{ 
    long nc; 

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

enter image description here

तुम मुझे समझा सकते हैं कारण है कि यह उस तरह से काम करता है से है। धन्यवाद।

^Z^Z या तो काम नहीं करता है (जब तक यह एक पंक्ति के आरंभ में है)

enter image description here

tty EOF चरित्र की
+0

उदाहरण नहीं देख सकता .. क्या आप यहां कोड पोस्ट कर सकते हैं? –

+4

यह विंडोज शैल का "फीचर" है। यूनिक्स पर, आप Ctrl + D को दो बार टाइप करके लाइन के अंत में EOF टाइप कर सकते हैं; Ctrl + Z दो बार टाइप करने का प्रयास करें। (या फ़ाइल से इनपुट रीडायरेक्ट करें।) –

+0

टाइपिंग Ctrl + Z दो बार या उससे अधिक काम नहीं करता है – Vorgin

उत्तर

0

पारंपरिक यूनिक्स व्याख्या पढ़ने जो कुछ बफ़र होने के बाद read वापसी अवरुद्ध करने के लिए है एक पके हुए टीटी लाइन बफर के अंदर। एक नई लाइन की शुरुआत में, इसका मतलब read 0 लौटा रहा है (शून्य बाइट्स पढ़ रहा है), और आकस्मिक रूप से, 0-आकार read सामान्य फाइलों पर फ़ाइल की स्थिति का अंत पता चला है।

यही कारण है कि पहले एक लाइन के बीच में EOF बस लाइन की शुरुआत मजबूर करता है read होने के लिए, सी क्रम पुस्तकालय फ़ाइल का अंत का पता नहीं लगा रही है। दोEOF पंक्तियों में वर्ण 0-आकार के पढ़ने का उत्पादन करते हैं, क्योंकि दूसरा एक रिक्त बफर को read पर एक एप्लिकेशन द्वारा मजबूर करता है।

$ cat 
foo[press ^D]foo <=== after ^D, input printed back before EOL, despite cooked mode. No EOF detected 
foo[press ^D]foo[press ^D] <=== after first ^D, input printed back, and on second ^D, cat detects EOF 

$ cat 
Some first line<CR> <=== input 
Some first line <=== the line is read and printed 
[press ^D] <=== at line start, ^D forces 0-sized read to happen, cat detects EOF 

मुझे लगता है कि अपने सी क्रम पुस्तकालय अर्थ विज्ञान से ऊपर (वहाँ kernel32 कॉल के स्तर पर ^Z का कोई विशेष हैंडलिंग, अकेले सिस्टम कॉल करते हैं विंडोज पर है) में वर्णित नकल। यही कारण है कि यह शायद इनपुट लाइन के बीच में ^Z^Z के बाद ईओएफ का पता लगाएगा।

+0

नहीं, ऐसा नहीं होगा।^जेड^जेड या अधिक काम नहीं करता है अगर इससे पहले इस लाइन में एक और अक्षर हैं। – Vorgin

0

कार्यक्रम केवल इनपुट के वास्तविक अंत में EOF पढ़ेगा। यदि आपका टर्मिनल/ओएस/जो कुछ भी लाइन की शुरुआत में फाइलों को समाप्त करने की अनुमति देता है तो वह वही है जहां आप उन्हें पा सकते हैं। मेरा मानना ​​है कि यह पुरानी शैली के टर्मिनल पर फेंक दिया गया है जहां डेटा केवल एक समय में एक लाइन प्रसारित किया गया था (क्योंकि मुझे पता है कि यह पेंच कार्ड पाठकों पर वापस जाता है)।

एक फ़ाइल से अपना डेटा पढ़ने का प्रयास करें जिसे आपने ईओएफ मिड-लाइन के साथ प्रीपेर किया है। आप यह भी पा सकते हैं कि कुछ संपादक इसे मुश्किल बनाते हैं! आपके प्रोग्राम को इनपुट के साथ ठीक काम करना चाहिए।

0

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

ऑपरेटिंग सिस्टम के आधार पर, EOF वर्ण केवल तभी काम करेगा जब यह लाइन पर पहला अक्षर है, यानी Enter के बाद पहला अक्षर। चूंकि कंसोल इनपुट अक्सर लाइन-उन्मुख होता है, इसलिए Enter के साथ इसका पालन करने के बाद भी सिस्टम EOF वर्ण को पहचान नहीं सकता है।

0

मुझे आपके जैसा ही प्रश्न हुआ। जब मैं getchar() फ़ंक्शन को समाप्त करना चाहता हूं, तो मुझे 2 EOF दर्ज करना होगा या <ENTER> प्लस EOF दर्ज करना होगा।

और यहाँ मैं इस सवाल के बारे में खोजा गया एक आसान जवाब है:

अगर वहाँ टर्मिनल में प्रवेश करने वर्ण है, EOF भूमिका इस प्रवेश, जो प्रवेश करने का एक नया मोड़ जगाना होगा रोक के रूप में खेलेंगे; जबकि, अगर कोई प्रविष्टि नहीं हो रही है, या किसी अन्य शब्द में, जब getchar() एक नए प्रवेश की प्रतीक्षा कर रहा है (जैसे कि आपने अभी प्रवेश किया है या एक ईओएफ), तो आप जो ईओएफ दर्ज कर रहे हैं वह अब "अंत फ़ाइल का ", जो फ़ंक्शन getchar() को निष्पादित करने से प्रोग्राम स्टॉप का नेतृत्व करेगा।

पीएस: प्रश्न तब होता है जब आप getchar() का उपयोग कर रहे हैं। मुझे लगता है कि यह उत्तर समझना आसान है, लेकिन शायद आपके लिए नहीं है क्योंकि इसका अनुवाद चीनी से किया जाता है ...

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