2009-08-07 11 views
6
#include <stdio.h> 
#define MAXLEN 256 

int main() { 
    int n; 
    char buf[MAXLEN]; 
    while((n = read(0,buf,sizeof(buf))) != 0){ 
    printf("n: %d:",n); 
    write(1,buf,n); 
    } 
    return 1; 
} 

कार्यक्रम (जहां पहले read और पहली write टर्मिनल से उपयोगकर्ता द्वारा टाइप किया और गूँजती है) के उत्पादन में है:लिखना() stdout और printf आउटपुट को interleaved नहीं?

read 
read 
write 
write 
n: 5:n: 6: 

printf के उत्पादन में विकास के लिए Ctrl + दबाने के बाद आता है मानक इनपुट और बाद के पढ़ने के साथ नहीं। ऐसा क्यों होता है?

उत्तर

18

प्रिंटफ को बफर करने के लिए इसे बदलकर इसे पुश करें।

आप 'फ्लश' अपने बफर fflush कॉल का उपयोग करने के लिए मजबूर कर सकते हैं printf:

#include <stdio.h> 
#define MAXLEN 256 

int main() { 
    int n; 
    char buf[MAXLEN]; 
    while((n = read(0,buf,sizeof(buf))) != 0){ 
    printf("n: %d:",n); 
    fflush(stdout); /* force it to go out */ 
    write(1,buf,n); 
    } 
    return 1; 
} 

सामान्य तौर पर, printf() बफ़र की जा रही एक अच्छी बात है। अनबफर आउटपुट, विशेष रूप से दृश्य कंसोल के लिए जिनके लिए स्क्रीन अपडेट की आवश्यकता होती है और धीमी है। धीरे-धीरे इतना धीमा है कि एक एप्लिकेशन जो प्रिंटिंग कर रहा है उसे सीधे धीमा कर दिया जा सकता है (विशेष रूप से विंडोज प्लेटफ़ॉर्म पर; लिनक्स और यूनिक्स आमतौर पर कम प्रभावित होते हैं)।

हालांकि, printf() buffered होने पर आपको fprintf(stderr,) - stderr जानबूझकर unbuffered किया जाता है। नतीजतन, आप अपने संदेश कुछ printf() गायब हो सकते हैं; यदि आप किसी अन्य FILE संभालते हैं जो टर्मिनल से भी जुड़ा हुआ है, और यह अनबफर किया जा सकता है, तो सुनिश्चित करें कि आप पहले स्पष्ट रूप से fflush(stdout) देखें।

+5

आप किसी भी आईओ करने से पहले setvbuf() के साथ बफरिंग मोड भी बदल सकते हैं। – AProgrammer

+0

"printf()' क्या है [buffered] (http://en.wikipedia.org/wiki/Data_buffer) "मतलब है? – ma11hew28

+0

http://stackoverflow.com/a/17552608/242933 – ma11hew28

1

प्रिंटफ stdio का उपयोग कर रहा है और यह buffered है। "n:% d: \ n"

+0

या तो, या आउटपुट चैनलों को मिश्रण न करें - यानी, सभी सामग्री को आउटपुट करने के लिए एक और एक ही फ़ंक्शन का उपयोग करें। –

+1

\ n इसे फ्लश करने की गारंटी नहीं है। – EFraim

+1

stdout लाइन buffered है जब तक यह एक गैर इंटरैक्टिव डिवाइस के लिए निर्देशित। – AProgrammer

2

fgets के लिए मैनपेज मुझसे कहता है:

यह निम्न स्तर के साथ stdio पुस्तकालय से इनपुट कार्यों के लिए कॉल मिश्रण उचित नहीं है (2) associ- फ़ाइल वर्णनकर्ता के साथ पैदा करने के लिए पढ़ने के लिए कॉल इनपुट स्ट्रीम; परिणाम अपरिभाषित होंगे और बहुत शायद आप जो चाहते हैं उसे नहीं।

तो सबसे अच्छा समाधान उसी वर्णनकर्ता पर लेखन और प्रिंटफ़ का उपयोग नहीं करना होगा।

+0

फ़्लश करने का कारण बन जाएगी, जब पॉसिक्स अनिवार्य रूप से निर्दिष्ट होते हैं जब परिणाम अपरिभाषित होते हैं और जब वे "सक्रिय हैंडल" की सारणी के आधार पर अच्छी तरह से परिभाषित होते हैं। Http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05_01 देखें –

0

लिखने के बजाय fwrite (स्ट्रीम संस्करण) का उपयोग करें।

ध्यान दें कि, जबकि फ़ाइल नंबर 1 से जुड़ा हुआ है, यह वही बात नहीं है।

1

आप std fflush() फ़ंक्शन का उपयोग std out buffer को फ्लश करने के लिए कर सकते हैं या आप printf के अंदर नियंत्रण स्ट्रिंग के अंत में अतिरिक्त \ n का उपयोग कर सकते हैं। इस

printf("\n :%d:\n",n); 

इसकी तरह कुछ हमेशा बेहतर लिखने का उपयोग करने के() के बजाय printf() और scanf सी में & पढ़ने() फ़ंक्शन()। Printf और scanf में कुछ समस्याएं हैं जैसे printf stdout buffer में स्ट्रिंग पैरामीटर को संग्रहीत करता है। तो एक मैनुअल फ्लश की आवश्यकता होती है जो fflush फ़ंक्शन के माध्यम से या \ n के माध्यम से किया जाता है। एक छोटे से हैलो वर्ल्ड प्रिंटिंग प्रोग्राम में आपको ऐसी समस्या नहीं मिलेगी क्योंकि प्रोग्राम निष्पादन के अंत में stdout बफर फ़्लश किया गया है। बेहतर उपयोग लिखें() जो ठीक काम करता है। स्कैनफ में रिक्त स्थान और स्टडीन बफर से संबंधित कई अन्य समस्याओं को पढ़ने की समस्या भी है।

नीचे कोड में उदाहरण के लिए:

main() { char a; int i=0,c; for(;i<2;i++) { scanf("%d",&c); scanf("%c",&a);} } 

उपरोक्त कार्यक्रम के रूप में दबाने में प्रवेश पर n stdin में पढ़ने \ की समस्या मिला है। हम इसे हल कर सकते हैं लेकिन stdin बफर को फ्लश नहीं कर रहे हैं या \ n चरित्र का उपयोग नहीं कर सकते हैं। पढ़ने() और लिखने() कार्यों का उपयोग करने के लिए हमेशा बेहतर है।

आशा है कि मदद करता है ....

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