Input & Output Filestream mit fStream
In C++ gibt es Standartmäßig eine fstream Klasse, mit der ein Zugriff auf physikalische Dateien in beiden Richtungen (lesen und schreiben) möglich ist! Dies sollte jedoch nicht simultan geschehen!. Mit einer Instanz sollte nur auf eine Datei Zugegriffen werden die zu diesem Zeitpunkt nur in eine Richtung transport wird. Für parallele Übertragungen können aber problemlos mehrere Instanzen erzeugt werden.
Beim instanzieren der Objekt-Variable (stream) muss schon per Flag definiert werden, wie das File-Objekt auf die Datei reagieren soll! Die Betriebsart zum Öffnen einer Datei muss duch mindestens ein einzelnes Flag definiert. Es können auch wie im Beispiel mehrere Flags gesetzt werden, sie sind dann durch ein Bitwises Oder (!) zu trennen.
Verfügbare Flags für die Betriebsart beim Öffnen einer Datei:
Flag - Name | Aufgabe | Auswirkung |
---|---|---|
std::ios::in | zum Lesen öffnen | Erstellt und Verändert nicht |
std::ios::out | zum Schreiben öffnen | Legt Datei an oder überschreibt |
std::ios::ate | gehe gleich ans Ende der Datei | Legt an falls nicht vorhanden |
std::ios::app | anhängen am Ende der Datei | |
std::ios::trunc | Datei leeren | |
std::ios::_Nocreate | Datei muss vorhanden sein | |
std::ios::_Noreplace | Datei darf nicht schon vorhanden sein | |
std::ios::binary | Binärmodus |
Da es sich um eine Textdatei handelt, ist std::ios::binary nicht gesetzt.
Die Auswahl der Flags sollte gut bedacht sein, da sie in vielen verschiedenen Konstellationen nämlich so richtig gar keinen Sinn mehr macht! Ein Klasiker darunter ist z.B. (std::ios::in|std::ios::ate)! Das Programm würde die Datei zum lesen öffnen und direkt an das Ende der Datei springen um dort mit dem lesen zu beginnen, An dieser Stelle kommt dann die Information EOF (End of File) und die Datei würde wieder geschlossen werden.
Gebräuchliche Flags:
std::ios::out | std::ios::_Nocreate, -- Schreibt nur, wenn Datei vorhanden ist.
std::ios::out | std::ios::app, -- Erstellt falls nicht vorhanden und hängt immer am Ende an.
std::ios::out | std::ios::_Noreplace -- Legt Datei an und schreibt wenn sie vorher nicht vorhanden war.
Datei:
Quelldateien/main.cpp- #include <iostream> // std::cout, std::endl, std::cin
- #include <fstream> // std::fstream
- #include <stdlib.h> // EXIT_SUCCESS
- #include <conio.h> // getch()
- #include <string> // std::cin
-
- using std::fstream;
- using std::system;
- using std::cout;
-
- int main(void)
- {
- // Textfarbe von Konsole ändern
- system("color 0a");
-
- // datei.txt laden bzw. erstellen
- fstream stream("datei.txt", std::ios::out | std::ios::app);
-
- // Die Methode stream.good() liefert das Ergebnis 0,
- // wenn die Datei nicht geöffnet werden konnte.
- if (stream.good())
- {
- // Mit std::cin auf Eingabe warten
- std::string sEingabeName;
- do
- {
- cout << "\n Texteingabe: ";
- std::cin >> sEingabeName;
- }
- while (sEingabeName.length() < 2);
- // Die Abfrage ist beendet, wenn der Text länger wie 1 Zeichen ist
-
- // Jetzt wird der Text noch an die Datei gesendet! Dazu werden die Daten
- // wie bei cout mit << von rechts nach links in stream geschoben.
- stream << "Eingabe: " << sEingabeName << std::endl;
-
- // Bildschirm clearen
- system("cls");
- }
- else
- {
- // Im Fehlerfalle muss der Fehlerstatus vom
- // stream-Objekt zurückgesetzt werden!
- stream.clear();
- }
- // Stream schliessen um Speicher frei zu geben
- stream.close();
-
- // std::ios::in liesst Datei nur aus
- fstream stream2("datei.txt", std::ios::in);
- if (stream.good())
- {
- // Zeilenweise ausgeben
- char zeile[200];
- while (stream2.getline(zeile, 200))
- {
- cout << zeile << std::endl;
- }
- }
- else
- {
- stream2.clear();
- }
- stream2.close();
- // Nach der Bearbeitung der Dateidaten ist die Datei zu schließen.
- // Das Schließen ist besonders wichtig bei Dateien, die im Schreibmodus geöffnet wurden.
- // Denn die Daten werden vor dem Schreiben auf den Datenträger im Arbeitsspeicher
- // zwischengespeichert. Durch das Schließen der Datei wird dann der Zwischenspeicher
- // ordnungsgemäß auf den Datenträger übertragen und die Datei mit einer
- // End-Of-File-Abschlusskennung versehen. Wenn man die Datei in einer eigenen
- // Funktion öffnet, wird diese bei Verlassen der Funktion automatisch geschlossen!
-
-
- // Mit getch() auf Benutzeraktion warten, anstatt das Programm zu beenden
- getch();
- return EXIT_SUCCESS;
- }
-