2013-04-29 7 views
6

Ich habe gerade angefangen zu fragen - wie ist eigentlich std::fstream geöffnet mit beiden std::ios::in und std::ios::out eigentlich soll funktionieren? Was soll es tun? Schreibe etwas (zum Beispiel) in eine leere Datei, dann lese ... was? Nur geschriebener Wert? Wo wäre die Datei "Zeiger"/"Cursor"? Vielleicht die Antworten schon da draußen, aber ich hätte es einfach nicht finden können.Wie soll std :: fstream sowohl ein- als auch ausgehen?

Antwort

5

Was ist std::fstream?

std::fstream ist eine bidirektionale Datei-Stream-Klasse. Das heißt, es bietet eine Schnittstelle für die Eingabe und Ausgabe von Dateien. Es wird häufig verwendet, wenn ein Benutzer von derselben externen Sequenz lesen und in dieselbe schreiben muss.

Wenn eine bidirektionale Dateistrom Instanziieren (im Gegensatz zu std::ofstream oder std::ifstream), die openmodes ios_base::in und ios_base::out sind standardmäßig angegeben. Dies bedeutet, dass diese:

std::fstream f("test.txt", std::ios_base::in | std::ios_base::out); 

das gleiche ist wie

std::fstream f("test.txt"); 

One beiden Optionen angeben würde, wenn sie benötigen auch einig Nicht-Standard-openmodes hinzufügen wie trunc, ate, app oder binary. Der ios_base::trunc openmode wird benötigt, wenn Sie beabsichtigen, eine neue Datei für bidirektionale I/O zu erstellen, da der ios_base::in openmode die Erstellung einer neuen Datei deaktiviert.

Bidirectional I/O

Bidirectional I/O ist die Verwendung eines bidirektionalen Stroms für Eingang und Ausgang. In IOStreams pflegen die Standard-Streams ihre Zeichenfolgen in einem Puffer, in dem sie als Quelle oder Senke für Daten dienen. Für Ausgabeströme gibt es einen "put" -Bereich (der Puffer, der Zeichen für die Ausgabe enthält). Für Eingabeströme gibt es ebenfalls den "Get" -Bereich.

Im Fall von std::fstream (eine Klasse für beide Eingabe und Ausgabe), hält es einen gemeinsamen Dateipuffer, der jeweils die Get und Put-Bereich darstellt. Der Positionsindikator, der die aktuelle Position in der Datei markiert, wird durch die beiden Ausgabeoperationen und beeinflusst. Als solches, um I/O korrekt auf einem bidirektionalen Strom zu führen, gibt es bestimmte Regeln, die Sie folgen müssen:

  • Wenn Sie eine Lese nach einem Schreib- oder umgekehrt durchzuführen, sollte der Strom wieder neu positioniert werden.
  • Wenn eine Eingabeoperation das Ende der Datei erreicht, ist die Ausführung eines Schreibvorgangs direkt danach in Ordnung.

Dies bezieht sich nur auf std::fstream. Die obigen Regeln werden für std::stringstream nicht benötigt.

Ich hoffe, dass diese Ihre Fragen beantworten. Wenn Sie mehr haben, können Sie einfach in den Kommentaren fragen.

Verwandte Themen