2013-07-09 4 views
6

मैं के माध्यम से "सी प्रोग्रामिंग भाषा" काम कर रहा हूँ द्वारा कश्मीर & आर और उदाहरण 1.5 मुझे स्टम्प्ड गया है:थ्योरी getchar() और putchar() के पीछे कार्य

#include <stdio.h> 

/* copy input to output; 1st version */ 
int main(int argc, char *argv[]) 
{ 
    int c; 

    while ((c = getchar()) != EOF) 
     putchar(c); 

    return 0; 
} 

मैं समझता हूँ कि 'getchar()' प्रदर्शित करने के लिए 'putchar()' के लिए एक चरित्र लेता है। हालांकि, जब मैं टर्मिनल में प्रोग्राम चलाता हूं, तो यह क्यों है कि मैं 'putchar()' प्रदर्शित करने के लिए वर्णों की एक पूरी पंक्ति पारित कर सकता हूं?

+0

इसका सरल, डुप्लिकेट होना चाहिए, वैसे भी उत्तर देखें :) – 0decimal0

उत्तर

20

क्योंकि आपका टर्मिनल लाइन-बफर किया गया है। getchar() और putchar() अभी भी केवल एक वर्ण पर काम करते हैं लेकिन टर्मिनल प्रोग्राम तक वर्ण सबमिट करने की प्रतीक्षा करता है जब तक कि आप पूरी लाइन में प्रवेश नहीं कर लेते। फिर getchar() उस बफर से एक-एक-एक और putchar() का चरित्र उन्हें एक-एक करके प्रदर्शित करता है।

अतिरिक्त: टर्मिनल लाइन-बफर्ड का मतलब है कि यह एक न्यूलाइन चरित्र का सामना करने पर प्रोग्राम में इनपुट सबमिट करता है। एक समय में एक चरित्र के बजाय डेटा के ब्लॉक जमा करना आमतौर पर अधिक कुशल होता है। यह उपयोगकर्ता को एंटर दबाए जाने से पहले लाइन को संपादित करने का अवसर भी प्रदान करता है।

नोट: रेखा बफरिंग canonical mode for the terminal अक्षम और stdin पर NULL साथ setbuf फोन करके बंद किया जा सकता।

+0

यह समझ में आता है। धन्यवाद! स्पष्टीकरण के लिए – Raeven

+0

+1। लेकिन क्या आप इस लाइन पर अधिक विस्तार से बता सकते हैं: - "क्योंकि आपका टर्मिनल लाइन-बफर किया गया है"? –

+0

मेरे द्वारा +1 भी :) – 0decimal0

2

हाँ आप वास्तव में जो कुछ भी चाहते हैं उसे लिख सकते हैं जब तक कि यह एक ईओएफ चार नहीं है, कीबोर्ड एक विशेष I/O डिवाइस है, यह सीधे BIOS के माध्यम से काम करता है और कीबोर्ड पर टाइप किए गए वर्ण सीधे बफर में डाले जाते हैं यह बफर, आपके मामले में आदिम getchar() द्वारा पढ़ा जाता है, जब आप एक वाक्य टाइप करते हैं तो आप डेटा को बफर में दबा रहे हैं, और getchar() फ़ंक्शन एक अनंत लूप में है, यही कारण है कि यह काम करता है।

यदि आप आईओ डिवाइस कैसे काम करते हैं, तो आप मुझे और अधिक प्रश्न पूछ सकते हैं।

चीयर्स।

+0

बहुत बहुत धन्यवाद! – Raeven

+0

सीपी/एम के दिनों से कम से कम "ईओएफ चरित्र" जैसी कोई चीज़ नहीं है। सी में ईओएफ' इनपुट प्रवाह समाप्त होने पर 'getchar()' द्वारा वापस किया गया एक विशेष मूल्य है; इसके बारे में एक त्रुटि कोड के रूप में सोचें, चरित्र के रूप में नहीं। –

+0

आपका स्वागत है रेवेन –

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