2010-11-02 12 views
7

Come si fa a lanciare un ifstream in un istream. Immagino che se ifstream è un figlio di istream dovrei riuscire a farlo, ma ho avuto problemi con questo compito.Converti ifstream in 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

Infatti si possono assegnare direttamente, ma se si hanno problemi, dovresti pubblicare il tuo codice per sapere cosa c'è che non va. – casablanca

+0

In realtà non è necessario. Puoi semplicemente usare il flusso di file in qualunque posto sia necessario un istream e il compilatore farà un cast automatico per te. –

risposta

1

Prova:

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

Le stesse opere, se si dispone di un riferimento (&) per il tipo di flusso pure. static_cast è preferibile in questo caso poiché il cast viene eseguito in fase di compilazione, consentendo al compilatore di segnalare un errore se il cast non è possibile (ad esempio istream non era un tipo base di ifstream).

Inoltre, e probabilmente lo sai già, puoi passare un puntatore/riferimento a un ifstream a qualsiasi funzione che accetta un puntatore/riferimento a istream. Ad esempio, il seguente è consentito dalla lingua:

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

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

Penso che il 'static_cast' nel tuo primo blocco di codice non accada sul posto, quindi deve essere assegnato a un puntatore' std :: istream': 'std :: istream * myStream2 = static_cast (myStream); '. –

+1

Perché o perché o perché dovresti passare un puntatore quando farebbe riferimento? –

+0

@ Martin: stavo mostrando la flessibilità della lingua. Come non è chiaro dalla domanda dell'OP esattamente quale problema sta vivendo. –

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

Hai dimenticato un asterisco nel tuo cast dinamico. Penso che intendessi 'std :: istream * istreamObj = dynamic_cast (& ifStreamObj)' –

+1

Non solo non hai verificato che il codice fosse corretto. Non è necessario per il cast. Toglilo e lo compila ancora bene. Quando il compilatore funziona per te, non è necessario farlo da solo. –

+0

Le mie sincere scuse. I miei polsi sono stati tagliati, quindi nessun mortale può posare di nuovo gli occhi sui miei errori. Rilassati un po ', eh? Aggiungere un '*' ... – Neil

20

No cast è necessario.

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

Aiuterebbe IMHO a dire che questo funziona a causa del Polymorphism, ovvero il fatto che ifstream sia una sottoclasse di istream. (Per favore correggimi se sbaglio!) –

+2

@ Lee-Man: l'OP già menzionato (terminologia modulo), quindi non l'ho fatto. Saluti, –

Problemi correlati