2009-11-19 23 views
5

कोड के अंदर C++ आउटपुट को रीडायरेक्ट करने का कोई तरीका है? स्थिति यह है, मैं कुछ बाहरी .cpp और .h फ़ाइलों का उपयोग कर रहा हूं जो कंसोल को चेतावनी देने के लिए printf का उपयोग करते हैं। मैं अपने आउटपुट को संशोधित करने के बिना "केवल" इन आउटपुट (मेरा नहीं) को "बिना" फ़ाइल में रीडायरेक्ट करना चाहता हूं।सी ++ रीडायरेक्ट आउटपुट

तो; मेरे प्रोग्राम में, मैं आउटपुट को एक फ़ाइल में रीडायरेक्ट कर सकता हूं, और जब मैं फिर से फाइल को फिर से फाइल करने के लिए कुछ आउटपुट रीडायरेक्ट कर दूंगा, तो ...

क्या यह संभव है?

उत्तर

7

आप किसी फ़ाइल में stdout को पुनर्निर्देशित करने के लिए stdout पर freopen() का उपयोग कर सकते हैं।

+0

+1 के रूप में डुप्लिकेट, @DevSolar हां के साथ सही हैं। – DevSolar

+0

क्या यह प्रोग्राम के अंत तक किसी भी तरह की अनुमति है? क्या मुझे इसे फिर से कंसोल में डालने के लिए इसे परिवर्तित करने की ज़रूरत है? –

1

printf फ़ाइल डिस्क्रिप्टर 1 पर प्रिंट करेगा, आप इसे बंद कर सकते हैं और एक फ़ाइल खोल सकते हैं, यह आपको एक और एफडी, संभवतः 1 देगा क्योंकि यह सबसे कम एफडी उपलब्ध है, अगर नहीं तो आप पर्याप्त तेज़ नहीं थे।

यदि आप केवल close(1); और फिर int fd = open(file); एफडी 1 होना चाहिए यदि किसी ने बंद और खुले के बीच कुछ खोला नहीं है। उस समय एफडी नंबर 1 पर आउटपुट करने वाले किसी भी व्यक्ति को आपकी फाइल पर प्रिंट किया जाएगा।

ऐसा इसलिए है क्योंकि सिस्टम आपको lowest available file descriptor number देना चाहिए, इसलिए यह आपको 1 देगा जहां प्रिंटफ लिखते हैं।

जैसा कि @roe ने बताया है कि आप एक और एफडी नंबर प्राप्त करने के लिए पहले 1 से अधिक डुप्ली() करना पसंद कर सकते हैं जहां आप stdout पर प्रिंट कर सकते हैं।

+0

यदि आप अपनी खुद की सामग्री को stdout पर प्रिंट करना चाहते हैं तो आपको पहले इसे 'dup()' करना चाहिए। फिर आप चाहें तो 'dup2() 'के साथ आगे और पीछे स्विच कर सकते हैं। – falstro

+0

या डुप्लीड एफडी पर सीधे अपना डेटा लिखें ... मुझे लगता है कि यह भी बेहतर होगा। हालांकि इसे अभी भी डुप्लिकेट करने की आवश्यकता है। – falstro

+0

निश्चित रूप से एक पॉज़िक्स सिस्टम मानते हुए, और फिर भी आप संभावित रूप से खतरनाक चीजें कर रहे हैं जहां फिर से खोलें() पूरी तरह बिल को फिट करता है। सी पुस्तकालय और POSIX अच्छी तरह से मिश्रण नहीं है। मैं हमेशा खुला रहता हूं()/पढ़ा()/लिखना()/बंद() और fopen()/fread()/fwrite()/fclose() अच्छी तरह से अलग। – DevSolar

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