Du bist hier: Startseite > Entwicklung (C/C++) > C++ Grundlagen > Input & Output Filestream mit fStream

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
  1. #include <iostream> // std::cout, std::endl, std::cin
  2. #include <fstream> // std::fstream
  3. #include <stdlib.h> // EXIT_SUCCESS
  4. #include <conio.h> // getch()
  5. #include <string> // std::cin
  6.  
  7. using std::fstream;
  8. using std::system;
  9. using std::cout;
  10.  
  11. int main(void)
  12. {
  13. // Textfarbe von Konsole ändern
  14. system("color 0a");
  15.  
  16. // datei.txt laden bzw. erstellen
  17. fstream stream("datei.txt", std::ios::out | std::ios::app);
  18.  
  19. // Die Methode stream.good() liefert das Ergebnis 0,
  20. // wenn die Datei nicht geöffnet werden konnte.
  21. if (stream.good())
  22. {
  23. // Mit std::cin auf Eingabe warten
  24. std::string sEingabeName;
  25. do
  26. {
  27. cout << "\n Texteingabe: ";
  28. std::cin >> sEingabeName;
  29. }
  30. while (sEingabeName.length() < 2);
  31. // Die Abfrage ist beendet, wenn der Text länger wie 1 Zeichen ist
  32.  
  33. // Jetzt wird der Text noch an die Datei gesendet! Dazu werden die Daten
  34. // wie bei cout mit << von rechts nach links in stream geschoben.
  35. stream << "Eingabe: " << sEingabeName << std::endl;
  36.  
  37. // Bildschirm clearen
  38. system("cls");
  39. }
  40. else
  41. {
  42. // Im Fehlerfalle muss der Fehlerstatus vom
  43. // stream-Objekt zurückgesetzt werden!
  44. stream.clear();
  45. }
  46. // Stream schliessen um Speicher frei zu geben
  47. stream.close();
  48.  
  49. // std::ios::in liesst Datei nur aus
  50. fstream stream2("datei.txt", std::ios::in);
  51. if (stream.good())
  52. {
  53. // Zeilenweise ausgeben
  54. char zeile[200];
  55. while (stream2.getline(zeile, 200))
  56. {
  57. cout << zeile << std::endl;
  58. }
  59. }
  60. else
  61. {
  62. stream2.clear();
  63. }
  64. stream2.close();
  65. // Nach der Bearbeitung der Dateidaten ist die Datei zu schließen.
  66. // Das Schließen ist besonders wichtig bei Dateien, die im Schreibmodus geöffnet wurden.
  67. // Denn die Daten werden vor dem Schreiben auf den Datenträger im Arbeitsspeicher
  68. // zwischengespeichert. Durch das Schließen der Datei wird dann der Zwischenspeicher
  69. // ordnungsgemäß auf den Datenträger übertragen und die Datei mit einer
  70. // End-Of-File-Abschlusskennung versehen. Wenn man die Datei in einer eigenen
  71. // Funktion öffnet, wird diese bei Verlassen der Funktion automatisch geschlossen!
  72.  
  73.  
  74. // Mit getch() auf Benutzeraktion warten, anstatt das Programm zu beenden
  75. getch();
  76. return EXIT_SUCCESS;
  77. }
  78.  

Linux Anwender

Alle Befehle die mit system(...) anfangen, zuerst entfernen da es Windows Befehle sind!

Kommentare zu diesem Beitrag

Sie müssen angemeldet sein, um eine Nachricht zu erstellen. Anmelden »