2010-12-29 1 views
3

Wie wir in C++ wissen, haben wir die Klasse iostream, die von istream (basic_istream) und ostream (basic_ostream) geerbt wird. In jedem C++ Buch finden Sie, dass Sie mit Iostream Klassenobjekt lesen und in denselben Stream schreiben können. Aber ich sehe wirklich keine Erklärung oder ein Beispiel, um zu verstehen, warum ich solch ein seltsames Denken benutzen sollte. Ich weiß wirklich nicht, warum sollte ich in einen Stream schreiben und dann davon lesen :(.Wo sollte ich die Iostream-Klasse verwenden?

Könnten Sie mir erklären, wenn ich eine solche Konstruktion brauchen sollte? Ich denke, es muss serösen Grund für die Verwendung solcher Konstruktion (Vergiss nicht, dass wir nur für die Iostream-Deklaration virtuelle Vererbung und Mehrfachvererbung verwenden.

Auch wenn ich versuche, einen einfachen Code zu schreiben, der fsteram (Ableitung von Iostream) verwendet, finde ich, dass es nicht funktioniert . Art und Weise, die ich erwarte, dass hier mein Code:

#include <fstream> 
using namespace std; 
int main() 
{ 
    fstream fstr("somefile.txt",fstream::in|fstream::out);//fstream is deriveted from iosteram 
    int n; 
    fstr>>n;//reading n (WORKS FINE !!!). 

    fstr.flush(); 

    //trying to print Hello to the same file 
    fstr<<"Hello"<<endl;// NOT WORKING!!!!!!! 

    fstr.flush(); 

    return 0; 
} 

So könnten Sie mir sagen, warum dieser Code aus einer Datei lesen und kann nicht w Ritus etwas dazu ???

Resume: Bitte sagen Sie mir, warum wir Klasse iosteram brauchen und warum isteram und ostream nicht genug und wie man es benutzt.

Danke und Entschuldigung für mein Englisch :).

P.S. Wahrscheinlich ist diese Frage zu primitiv, aber bitte antworte mir.

Bearbeiten: Mein Code funktioniert jetzt. Danke an Murka.

Antwort

1

Sie möchten möglicherweise aus demselben Stream lesen und in denselben schreiben, da der Stream Typkonvertierungen ausführt, wie beispielsweise std :: stringstream. Sie könnten auch Iostream-Abstraktionen über Datenquellen haben, die sowohl Lesen als auch Schreiben erlauben, wie beispielsweise einen Socket oder einen In-Memory-Puffer.

+0

Ok, als könntest du erklären, warum ich fstream brauche und was ich in meinem Code falsch mache? – UmmaGumma

+0

@Ashot: Wenn Sie generell nach Iostream fragen möchten, öffnen Sie eine Frage.Wenn Sie nach einem bestimmten Code mit fstream fragen möchten, öffnen Sie eine andere Frage. Die beiden sind nicht verwandt. – Puppy

0

, wenn ich eine solche Konstruktion benötigen, sollten

Selten. Siehe meine Antwort hier: https://stackoverflow.com/questions/4517299/is-fstream-better-than-iostream-in-c/4517883#4517883

Edited: Wenn Sie nicht denken, Sie es brauchen, Sie brauchen es nicht.

+0

@Readwald. Ok, ich denke auch, dass es in deinem Beispiel besser ist, std :: istream oder std :: ostream zu schreiben, aber meine Frage ist, warum sollte ich die Fähigkeit haben, gleichzeitig in die Datei zu lesen und zu schreiben? – UmmaGumma

2

warum soll ich lesen können und in die Datei gleichzeitig schreiben?

Sie könnten diese Fähigkeit für ein Programm benötigen, das Updates oder eine vorhandene Datei bearbeitet: Es muss lesen, was bereits vorhanden ist, um das Teil zu finden aktualisiert oder bearbeitet werden, und müssen das Update (Änderung) schreiben zu der Datei.

+0

Ok, als könntest du mir sagen, was ich in meinem Beispiel falsch mache? Glauben Sie auch nicht, dass 2 Objekte ifstream und ofstream logischer sind. Und wenn es eine Erklärung als, ich denke, dass fstream nicht benötigt wird. Vielleicht Iostream ist nicht usless becouse mit Sockets als Streams klingt gut für mich, aber im Falle von Dateien, die ich glaube, mit ifstream und Ofstream sind viel besser – UmmaGumma

4

IIRC müssen Sie suchen, bevor Sie schreiben können, fragen Sie nicht, warum. Es wurde auch Code hinzugefügt, um alle Flags zu löschen, die möglicherweise ausgelöst werden.

#include <fstream> 
using namespace std; 
int main() 
{ 
    fstream fstr("somefile.txt",fstream::in|fstream::out);//fstream is deriveted from iosteram 
    int n; 
    fstr>>n;//reading n (WORKS FINE !!!). 

    fstr.clear();  //Clear any errors, eof, etc. 
    fstr.seekg(0, ios::beg); //Seek to beginning of file 
    fstr.flush(); 

    //trying to print Hello to the same file 
    fstr<<"Hello"<<endl;// NOW WORKS!!! 

    fstr.flush(); 

    return 0; 
} 
+0

O, danke, es funktioniert endlich :). – UmmaGumma