2010-11-02 17 views
7

Wie würde man einen ifstream in einen istream schreiben? Ich denke, da Ifstream ein Kind von istream ist, sollte ich dazu in der Lage sein, aber ich hatte Probleme mit einer solchen Aufgabe.Convert 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

der Tat können Sie direkt ihnen zuweisen, aber wenn Sie Probleme haben, Sie sollte deinen Code posten, damit wir wissen, was falsch ist. – casablanca

+0

Sie sollten eigentlich nicht brauchen. Sie können den Dateistream einfach an jedem beliebigen Ort verwenden, an dem ein istream benötigt wird, und der Compiler wird eine automatische Umwandlung für Sie vornehmen. –

Antwort

1

Versuchen:

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

Das gleiche funktioniert, wenn Sie einen Verweis (&) mit dem Stream-Typ als auch haben. static_cast ist in diesem Fall bevorzugt, da die Umwandlung zur Kompilierungszeit erfolgt, wodurch der Compiler einen Fehler melden kann, wenn die Umwandlung nicht möglich ist (d. H. istream war kein Basistyp von ifstream).

Zusätzlich, und Sie wahrscheinlich bereits wissen, können Sie einen Zeiger/Verweis auf eine ifstream zu einer Funktion übergeben, die einen Zeiger/Verweis auf eine istream akzeptiert. Zum Beispiel wird die folgende von der Sprache erlaubt:

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

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

Ich denke, die 'static_cast' in Ihrem ersten Code-Block passiert nicht in-Ort, so dass es zu einem' std :: iStream' Zeiger zugewiesen werden muss: 'std :: istream * myStream2 = statische_cast (myStream); '. –

+1

Warum o warum o warum würden Sie einen Zeiger übergeben, wenn eine Referenz genügen würde? –

+0

@Martin: Ich zeigte nur Flexibilität der Sprache. Aus der Frage des OP ging nicht eindeutig hervor, welches Problem er/sie hat. –

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

Sie haben in Ihrer dynamischen Besetzung ein Sternchen vergessen. Ich glaube, du meintest 'std :: isotream * istreamObj = dynamic_cast (& ifStreamObj)' –

+1

Nicht nur, dass du nicht verifiziert hast, dass der Code korrekt war. Es gibt keinen tatsächlichen Bedarf für die Besetzung. Nimm es raus und es geht immer noch gut. Wenn der Compiler für Sie arbeitet, müssen Sie das nicht selbst tun. –

+0

Ich entschuldige mich aufrichtig. Meine Handgelenke sind aufgeschlitzt, also darf kein Sterblicher wieder meine Fehler sehen. Entspannen Sie sich ein wenig, was? Hinzufügen eines "*" ... – Neil

20

Keine Besetzung notwendig ist.

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

Es würde IMHO helfen zu erwähnen, dass dies wegen Polymorphismus funktioniert, d. H. Der Tatsache, dass ifstream eine Unterklasse von istream ist. (Bitte korrigieren Sie mich, wenn ich falsch liege!) –

+2

@ Lee-Man: das OP schon erwähnt, dass (Modulo Terminologie), also habe ich nicht. Prost, –