चलिए इसे लाइन से लाइन से गुजरते हैं। 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");
हाँ, उसको कॉपी करें। दिमाग में रहेंगे। धन्यवाद :) – vindyz
ऊपर देवता देवता, कोई भी _that_ क्यों करना चाहता है? (एक स्रोत-कम लाइब्रेरी के लिए एक हताश आखिरी-खाई के कामकाज के रूप में जो stdout को लिखने पर जोर देता है, वह है)। –
अगर कोई डिबगिंग उद्देश्यों के लिए अलग-अलग फ़ाइलों को अलग-अलग लॉग संदेशों को रीडायरेक्ट करना चाहता है, तो इसके लिए यह काफी आसान है। – vindyz