2010-11-02 12 views
7

कोई आईस्ट्रीम में ifstream कास्टिंग करने के बारे में कैसे जाएगा। मुझे लगता है कि अगर आईस्ट्रीम आईट्रीम का बच्चा है तो मुझे ऐसा करने में सक्षम होना चाहिए, लेकिन मुझे इस तरह के कार्य में समस्याएं आ रही हैं।ifstream को istream में कनवर्ट करें

std::istream & inputStr = std::cin; 
    std::ostream & outputStr = std::cout; 
    if(argc == 3){ 
    std::fstream inputFile; 
    inputFile.open(argv[1], std::fstream::in); 
    if(!inputFile){ 
     std::cerr << "Error opening input file"; 
     exit(1); 
    } 
    inputStr = inputFile; 
..... 
} 
+0

http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-09/0856.html – DumbCoder

+0

दरअसल आप सीधे, उन्हें प्रदान कर सकते हैं, लेकिन अगर आप समस्या हो रही है आप अपना कोड पोस्ट करना चाहिए ताकि हम जान सकें कि क्या गलत है। – casablanca

+0

आपको वास्तव में आवश्यकता नहीं है। आप किसी भी स्थान पर किसी भी स्थान पर फ़ाइल स्ट्रीम का उपयोग कर सकते हैं और कंपाइलर आपके लिए एक ऑटो कास्ट करेगा। –

उत्तर

1

प्रयास करें:

std::ifstream* myStream; 
std::istream* myOtherStream = static_cast<std::istream*>(myStream); 
myOtherStream = myStream; // implicit cast since types are related. 

एक ही काम करता है अगर आप धारा प्रकार के लिए एक संदर्भ (&) के रूप में अच्छी तरह से की है। इस मामले में static_cast को प्राथमिकता दी जाती है क्योंकि कास्ट संकलन-समय पर किया जाता है, जिससे कंपेलर किसी त्रुटि की रिपोर्ट करने की अनुमति देता है यदि कास्ट संभव नहीं है (यानी istreamifstream का आधार प्रकार नहीं था)।

इसके अतिरिक्त, और आप शायद पहले से ही यह जानते हैं, तो आप ifstream पर istream के पॉइंटर/संदर्भ को स्वीकार करने वाले किसी भी फ़ंक्शन में पॉइंटर/संदर्भ पास कर सकते हैं। उदाहरण के लिए, निम्न भाषा द्वारा अनुमति दी है:

void processStream(const std::istream& stream); 

std::ifstream* myStream; 
processStream(*myStream); 
+0

मुझे लगता है कि आपके पहले कोड ब्लॉक में 'static_cast' जगह में नहीं होता है, इसलिए इसे' std :: istream' सूचक को असाइन करने की आवश्यकता है: 'std :: istream * myStream2 = static_cast (myStream); '। –

+1

क्यों ओ संदर्भ क्यों एक संकेतक होगा जब आप एक संकेतक पास करेंगे? –

+0

@ मार्टिन: मैं सिर्फ भाषा की लचीलापन दिखा रहा था। चूंकि यह ओपी के सवाल से स्पष्ट नहीं था कि वह वास्तव में किस समस्या का सामना कर रहा है। –

0
std::istream *istreamObj = dynamic_cast<std::istream *>(&ifStreamObj) 
+0

आप अपने गतिशील कलाकार में एक तारांकन भूल गए। मुझे लगता है कि आपका मतलब था 'std :: istream * istreamObj = dynamic_cast (और ifStreamObj) ' –

+1

न केवल आपने सत्यापित किया कि कोड सही था। कलाकारों के लिए कोई वास्तविक आवश्यकता नहीं है। इसे बाहर निकालो और यह अभी भी ठीक संकलित है। जब संकलक आपके लिए काम करता है तो वास्तव में इसे स्वयं करने की आवश्यकता नहीं होती है। –

+0

मेरी ईमानदारी से माफ़ी। मेरी कलाईें फिसल गई हैं, इसलिए मेरी गलतियों पर कोई प्राणघातक आँखें नहीं रख सकता है। थोड़ा आराम करो, आह? '*' जोड़ना ... – Neil

20

कोई कास्ट आवश्यक है।

#include <fstream> 
int main() 
{ 
    using namespace std; 
    ifstream f; 
    istream& s = f; 
} 
+2

यह आईएमएचओ का उल्लेख करने में मदद करेगा कि यह पॉलिमॉर्फिज्म के कारण काम करता है, यानी तथ्य यह है कि अगरस्ट्रीम आईट्रीम का उप-वर्ग है। (अगर मैं गलत हूं तो कृपया मुझे सही करें!) –

+2

@ ली-मैन: ओपी ने पहले ही उल्लेख किया है कि (मॉड्यूलो शब्दावली), इसलिए मैंने नहीं किया। चीयर्स, –

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