आप किसी अन्य के साथ CIN के streambuf की जगह ले सकता है, और कुछ कार्यक्रमों इस के आसपास गुजर की सामान्य रणनीति से अधिक सरल है का जिक्र किए बिना istreams सीधे सीन।
int main(int argc, char* argv[]) {
ifstream input;
streambuf* orig_cin = 0;
if (argc >= 2) {
input.open(argv[1]);
if (!input) return 1;
orig_cin = cin.rdbuf(input.rdbuf());
cin.tie(0); // tied to cout by default
}
try {
// normal program using cin
}
catch (...) {
if (orig_cin) cin.rdbuf(orig_cin);
throw;
}
return 0;
}
भले ही यह अत्यंत CIN के बाद नियंत्रण मुख्य छोड़ देता है उपयोग करने के लिए दुर्लभ है, इसके बाद के संस्करण कोशिश पकड़ अपरिभाषित व्यवहार से बचा जाता है कि अगर कुछ अपने कार्यक्रम कर सकता है।
स्रोत
2010-03-09 06:54:26
फ़ाइल को बाध्य करने के बाद सीट को टाई करना क्यों जरूरी है लेकिन कैच ब्लॉक में नहीं? – m42a
@ m42a यह cout से _untied_ है। लेकिन मैं मानता हूं कि हम इसे वापस बांधना चाहते हैं। –
@ m42a: ट्राइंग फ्लशिंग को प्रभावित करता है (सीन स्टडीन से सीन पढ़ने से पहले, यह कोउट फ्लश करता है) जब सीन को "रीडायरेक्ट" किया जाता है तो इसकी आवश्यकता नहीं होती है। ज्यादातर मामलों में, नियंत्रण के बाद मुख्य रूप से सीन से पढ़ने के लिए यह एक तर्क त्रुटि होगी, लेकिन कम से कम अगर आप स्ट्रीमबफ को पुनर्स्थापित करते हैं तो आप अपरिभाषित व्यवहार से बचेंगे (ifstream से filebuf नष्ट हो जाएगा)। यदि आप चाहें तो आप 'cin.tie (& cout)' का उपयोग कर सकते हैं। –