2011-08-07 13 views
5

नीचे कोड एक फ़ाइल fname & पर stdout को रीडायरेक्ट करता है फिर मूल stdout पर रीडायरेक्ट करता है। यह मेरे लिए ठीक काम करता है। लेकिन मैं समझ नहीं पा रहा हूं कि यह वास्तव में कैसे काम करता है। अगर कोई मुझे समझने में मदद कर सकता है तो मैं इसे समझूंगा।यह stdout पुनर्निर्देशन कैसे काम करता है?

printf("\n This is console"); 
    fflush(stdout); 
    fgetpos(stdout, &pos); 
    fd = dup(fileno(stdout)); 
    freopen(fname, "a+", stdout); 

    printf("inside file op"); 

    fflush(stdout); 
    dup2(fd,fileno(stdout)); 
    close(fd); 
    clearerr(stdout); 
    fsetpos(stdout, &pos); 
    printf("\nBack to Console"); 
+0

हाँ, उसको कॉपी करें। दिमाग में रहेंगे। धन्यवाद :) – vindyz

+2

ऊपर देवता देवता, कोई भी _that_ क्यों करना चाहता है? (एक स्रोत-कम लाइब्रेरी के लिए एक हताश आखिरी-खाई के कामकाज के रूप में जो stdout को लिखने पर जोर देता है, वह है)। –

+0

अगर कोई डिबगिंग उद्देश्यों के लिए अलग-अलग फ़ाइलों को अलग-अलग लॉग संदेशों को रीडायरेक्ट करना चाहता है, तो इसके लिए यह काफी आसान है। – vindyz

उत्तर

14

चलिए इसे लाइन से लाइन से गुजरते हैं। stdout को पहली पंक्ति प्रिंट कुछ:

printf("\n This is console"); 

तो यह stdout तो बफर में सभी शेष डेटा stdout लिए भेजा जाता है flushes और फ़ाइल डेटा के साथ मिश्रित नहीं किया जाएगा:

fflush(stdout); 

अब हम stdout में खुद की वर्तमान स्थिति को स्टोर करते हैं क्योंकि अन्यथा stdout पहले ही किसी फ़ाइल को निर्देशित किया गया था, तो हम इसके पहले हिस्सों को ओवरराइट कर सकते हैं।

fgetpos(stdout, &pos); 

अब हम वर्तमान में stdout के फ़ाइल डिस्क्रिप्टर को क्लोन करते हैं।

freopen(fname, "a+", stdout); 
: हम फ़ाइल के रूप में stdout फिर से खोलना कर सकते हैं,

fd = dup(fileno(stdout)); 

है कि हम सब कुछ संरक्षित है अब: हम करने के लिए जहां stdout अंक बदलने वाले हैं बाद से, हम मूल की एक प्रति रखने की जरूरत है

इस बिंदु पर, stdout को फ़ाइल पर रीडायरेक्ट कर दिया गया है। अब हम इसे प्रिंट कर सकते हैं:

printf("inside file op"); 

अब हम फ़ाइल को प्रिंट कर रहे हैं। हम stdout (अब फाइल) फ्लश करने के लिए की जरूरत है ताकि यह सामान्य stdout डेटा के साथ मिश्रित नहीं करता है:

fflush(stdout); 

उसके बाद, हम वर्तमान stdout वर्णनकर्ता से अधिक मूल stdout फ़ाइल वर्णनकर्ता क्लोन।

dup2(fd,fileno(stdout)); 

क्लोन जिसे अब शायद बंद किया जा सकता है:

close(fd); 

मैं काफी यकीन है कि क्यों यह यहाँ है नहीं कर रहा हूँ, लेकिन यह किसी भी त्रुटि है कि फ़ाइल के लिए लिख हुआ साफ करता है:

clearerr(stdout); 

अब हम stdout में अपनी स्थिति को पुनर्स्थापित कर सकते हैं। फिर से, जहाँ तक मुझे पता है, यह केवल उपयोगी है अगर यह मूल रूप से एक फ़ाइल पर पुनः निर्देशित किया गया था:

fsetpos(stdout, &pos); 

अब हम मूल stdout को वापस आ गए हैं, तो हम फिर से मुद्रित कर सकते हैं:

printf("\nBack to Console"); 
+0

बहुत अच्छा लगता है .. अब यह और अधिक स्पष्ट है। धन्यवाद इसकी सराहना करते हैं। एक असाधारण विस्तृत उत्तर के लिए – vindyz

+0

+1। – templatetypedef

+0

क्या ऐसा करने का कोई और तरीका है। अधिक कुशल हो सकता है .. – vindyz

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