2010-01-23 18 views
14

stdout टर्मिनल से कनेक्ट होने पर लाइन-बफर किया गया है, लेकिन मुझे कहीं पढ़ना याद है कि पढ़ना (कम से कम stdin से) स्वचालित रूप से stdout फ्लश करेगा। मेरे द्वारा उपयोग किए गए सभी सी कार्यान्वयन ने यह किया है, लेकिन मुझे अब मानक में नहीं मिल रहा है।stdin flush stdout से पढ़ रहा है?

यह भावना है कि यह उस तरह से काम करता है, अन्यथा इस तरह कोड पड़ता है:

printf("Type some input: "); 
fgets(line, sizeof line, stdin); 

की आवश्यकता होगी एक अतिरिक्त fflush(stdout);

तो stdout यहाँ प्लावित होने की गारंटी है?

संपादित करें:

के रूप में कई उत्तरों कहा है, वहाँ मानक है कि उत्पादन मेरी उदाहरण stdin से पढ़ने से पहले दिखाई देगा में stdout करने में कोई गारंटी प्रतीत हो रहा है, लेकिन दूसरी ओर , इस आशय मानक (के अपने मुक्त मसौदा प्रतिलिपि) में कहा गया है:

इनपुट और आउटपुट इंटरैक्टिव उपकरणों की गतिशीलता 7.19.3 में विनिर्दिष्ट जगह ले जाएगा। का इरादा यह है कि या लाइन-बफर्ड आउटपुट जल्द से जल्द जितनी संभव हो सके, संदेश को इनपुट इनपुट के लिए प्रतीक्षा करने से पहले दिखाई देने के लिए यह सुनिश्चित करने के लिए अनबफर किया गया है।

(आईएसओ/आईईसी 98 99: टीसी 2 कमेटी ड्राफ्ट - 6 मई, 2005, पृष्ठ 14)।

तो ऐसा लगता है कि कोई गारंटी नहीं है, लेकिन यह संभवतः अधिकांश कार्यान्वयन में काम करेगा। (प्रसिद्ध अंतिम शब्द ...)

+1

7.1 9.3 (सी 11 में 7.21.3) के क्रॉस संदर्भ के बाद भी उपयोगी है, क्योंकि यह उल्लेख करता है कि इनपुट ऑपरेशन से फ्लशिंग होने की क्या उम्मीद है। इन पर चर्चा की गई है https://stackoverflow.com/a/39536803/8586227। –

उत्तर

4

नहीं, ऐसा नहीं है।

+0

लेकिन आम तौर पर हम जो देखते हैं वह है कि stgetout fgets लाइन से पहले flushed है। तो, यह यहाँ क्यों फंस रहा है। –

+0

ऐसा लगता है कि एक सी कार्यान्वयन मानक द्वारा _allowed_ है जो fgets से पहले संकेत मुद्रित नहीं करने के लिए है, लेकिन "इरादा" यह है कि, और मुझे लगता है कि अधिकांश (सभी?) कार्यान्वयन करते हैं। –

+0

इस इरादे के बाद सभी इनपुट बहुत धीमे, और संदिग्ध लाभ के लिए। –

4

नहीं। आपको fflush (stdout) की आवश्यकता है; टर्मिनल पर आउटपुट भेज रहे प्रत्येक नई लाइन पर कई कार्यान्वयन फ्लश होंगे।

+0

मानक द्वारा लाइन buffered या unbuffered होने के लिए मानक द्वारा AFIAK 'stdout' की आवश्यकता होती है। – ybungalobill

5

आपके प्रश्न का उत्तर के लिए, आपको अपने printf() कॉल के बाद अतिरिक्त fflush(stdout); जरूरत है यकीन है कि शीघ्र प्रदर्शित होने में अपने कार्यक्रम इनपुट पढ़ने का प्रयास बनाने के लिए कर stdin से पढ़ना आपके लिए fflush(stdout); नहीं है।

4

नहीं stdin/stdout buffered हैं। वीडियो मेमोरी/यूनिक्स टर्मिनल की मेमोरी में बफर किए गए डेटा को टर्मिनल जैसे व्यू डिवाइस पर धक्का देने के लिए आपको fflush(stdout) की व्याख्या करने की आवश्यकता है। डेटा का बफरिंग setvbuf पर कॉल करके सेट किया जा सकता है।

संपादित करें: धन्यवाद जोनाथन, प्रश्न का उत्तर देने के लिए, stdin से पढ़ना stdout फ्लश नहीं करता है। setvbuf का उपयोग करने के तरीके को प्रदर्शित करने वाले कोड को निर्दिष्ट करके मैं यहां एक स्पर्शरेखा से बाहर हो गया होगा।

 
    #include 

    int main(void) 
    { 
    FILE *input, *output; 
    char bufr[512]; 

    input = fopen("file.in", "r+b"); 
    output = fopen("file.out", "w"); 

    /* set up input stream for minimal disk access, 
     using our own character buffer */ 
    if (setvbuf(input, bufr, _IOFBF, 512) != 0) 
     printf("failed to set up buffer for input file\n"); 
    else 
     printf("buffer set up for input file\n"); 

    /* set up output stream for line buffering using space that 
     will be obtained through an indirect call to malloc */ 
    if (setvbuf(output, NULL, _IOLBF, 132) != 0) 
     printf("failed to set up buffer for output file\n"); 
    else 
     printf("buffer set up for output file\n"); 

    /* perform file I/O here */ 

    /* close files */ 
    fclose(input); 
    fclose(output); 
    return 0; 
    } 

आशा इस मदद करता है, सादर, टॉम।

+0

आपका कोड stdin और stdout के व्यवहार से कैसे संबंधित है? –

+0

@ जोनाथन: यह एक नमूना है कि सेटवबफ का उपयोग करके 512 होने के लिए इनपुट के लिए बफर कैसे सेट किया जाए, या उस मामले के लिए कोई भी आंकड़ा, अधिमानतः एक शब्द सीमा पर। यह सेटवबफ के उपयोग को दिखाते हुए बोर्लैंड सी कंपाइलर पर सहायता फ़ाइल से लिया गया एक नमूना था। – t0mm13b

+0

कोड किसी अन्य प्रश्न के उत्तर के रूप में ठीक है - यह पूछे गए प्रश्न को संबोधित नहीं करता है, जो "stdin flush stdout से पढ़ रहा है"। मैं आपको एक स्पर्शिक उत्तर के लिए दंडित नहीं कर रहा हूं - लेकिन मैं आपके उत्तर को स्पर्श करने पर विचार करता हूं। –

2

नहीं, यह मानक का हिस्सा नहीं है।यह निश्चित रूप से संभव है कि आपने लाइब्रेरी कार्यान्वयन का उपयोग किया है जहां आपने वर्णित व्यवहार किया था, लेकिन यह एक गैर-मानक एक्सटेंशन है जिस पर आपको भरोसा नहीं करना चाहिए।

1

नहीं। स्टडी स्ट्रीम पर काम करते समय या स्टडआउट ब्लॉक पर लिखते समय सेंट-प्रोसेस से निपटने के दौरान इंटर-प्रोसेस डेडलॉक्स के लिए देखें।

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