C++ Dateien und Streams

Bisher haben wiriostreamdie Standardbibliothek verwendet, diecinundcout bereitstelltDiese Methoden werden jeweils zum Lesen von Streams aus der Standardeingabe und zum Schreiben von Streams in die Standardausgabe verwendet.

Dieses Tutorial erklärt, wie man Streams aus einer Datei liest und Streams in eine Datei schreibt. Dies erfordert eine weitere Standardbibliothek in C++fstream, die drei neue Datentypen definiert:

Datentypen Beschreibung
ofstream Dieser Datentyp repräsentiert einen Ausgabedateistream und wird verwendet, um Dateien zu erstellen und Informationen in Dateien zu schreiben.
ifstream Dieser Datentyp repräsentiert einen Eingabedateistream und wird verwendet, um Informationen aus Dateien zu lesen.
fstream Dieser Datentyp repräsentiert im Allgemeinen einen Dateistream und besitzt sowohl ofstream- als auch ifstream-Fähigkeiten, was bedeutet, dass er Dateien erstellen, Informationen in Dateien schreiben und Informationen aus Dateien lesen kann.

Um Dateiverarbeitung in C++ durchzuführen, müssen Sie die Header-Dateien <iostream> und <fstream> in Ihre C++-Quelldatei einbinden.

Eine Datei öffnen

Bevor Informationen aus einer Datei gelesen oder Informationen in eine Datei geschrieben werden, muss die Datei zuerst geöffnet werden.ofstreamundfstreamDiese Objekte können verwendet werden, um Dateien für Schreibvorgänge zu öffnen. Wenn Sie eine Datei nur für Lesevorgänge öffnen müssen, verwenden Sieifstream-Objekt.

Nachfolgend finden Sie die Standardsyntax für die Funktion open(), die ein Member der Objekte fstream, ifstream und ofstream ist.

void open(const char *filename, ios::openmode mode);

Hierbei gibt der erste Parameter der Memberfunktionopen()den Namen und Speicherort der zu öffnenden Datei an, und der zweite Parameter definiert den Modus, in dem die Datei geöffnet wird.

Modus-Flags Beschreibung
ios::app Append-Modus. Alle Schreibvorgänge werden an das Ende der Datei angehängt.
ios::ate Positioniert nach dem Öffnen an das Ende der Datei.
ios::in Öffnet die Datei zum Lesen.
ios::out Öffnet die Datei zum Schreiben.
ios::trunc Wenn die Datei bereits existiert, wird ihr Inhalt gekürzt, bevor die Datei geöffnet wird, das heißt, die Dateilänge wird auf 0 gesetzt.

Sie können zwei oder mehr der oben genannten Modi kombinieren. Wenn Sie beispielsweise eine Datei im Schreibmodus öffnen und die Datei kürzen möchten, falls sie bereits vorhanden ist, können Sie die folgende Syntax verwenden:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

Ebenso, wenn Sie eine Datei zum Lesen und Schreiben öffnen möchten, können Sie die folgende Syntax verwenden:

ifstream  afile;
afile.open("file.dat", ios::out | ios::in );

Eine Datei schließen

Wenn ein C++-Programm beendet wird, leert es automatisch alle Streams, gibt den gesamten zugewiesenen Speicher frei und schließt alle geöffneten Dateien. Programmierer sollten jedoch die gute Angewohnheit entwickeln, alle geöffneten Dateien zu schließen, bevor das Programm beendet wird.

Nachfolgend sehen Sie die Standardsyntax für die Funktion close(), die ein Mitglied der Objekte fstream, ifstream und ofstream ist.

void close();

In eine Datei schreiben

In der C++-Programmierung verwenden wir den Stream-Einfügeoperator (<<), um Informationen in eine Datei zu schreiben, genau wie wir diesen Operator verwenden, um Informationen auf dem Bildschirm auszugeben. Der einzige Unterschied ist, dass Sie hierofstreamoderfstreamObjekt verwenden, stattcoutObjekt.

Aus einer Datei lesen

In der C++-Programmierung verwenden wir den Stream-Extraktionsoperator (>>), um Informationen aus einer Datei zu lesen, genau wie wir diesen Operator verwenden, um Informationen von der Tastatur einzugeben. Der einzige Unterschied ist, dass Sie hierifstreamoderfstreamObjekt, stattcinObjekt.

Lese- und Schreibbeispiel

Das folgende C++-Programm öffnet eine Datei im Lese-/Schreibmodus. Nachdem die vom Benutzer eingegebenen Informationen in die Datei afile.dat geschrieben wurden, liest das Programm die Informationen aus der Datei und gibt sie auf dem Bildschirm aus:

Beispiel

#include <fstream> #include <iostream> using namespace std; int main() { char data[100]; // Datei im Schreibmodus öffnen ofstream outfile; outfile.open("afile.dat"); cout << "Writing to the file" << endl; cout << "Geben Sie Ihren Namen ein: "; cin.getline(data, 100); // Benutzereingabedaten in die Datei schreiben outfile << data << endl; cout << "Geben Sie Ihr Alter ein: "; cin >> data; cin.ignore(); // Benutzereingabedaten erneut in die Datei schreiben outfile << data << endl; // Die geöffnete Datei schließen outfile.close(); // Die Datei im Lesemodus öffnen ifstream infile; infile.open("afile.dat"); cout << "Aus der Datei lesen" << endl; infile >> data; // Daten auf den Bildschirm schreiben cout << data << endl; // Daten erneut aus der Datei lesen und anzeigen infile >> data; cout << data << endl; // Die geöffnete Datei schließen infile.close(); return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er die folgende Eingabe und Ausgabe:

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

Das obige Beispiel verwendet zusätzliche Funktionen des cin-Objekts, wie die Funktion getline() zum Lesen einer Zeile aus einer externen Eingabe und die Funktion ignore() zum Ignorieren zusätzlicher Zeichen, die von vorherigen Leseanweisungen übrig geblieben sind.

Dateipositionszeiger

istreamundostreambieten beide Mitgliedsfunktionen zum Neupositionieren des Dateipositionszeigers. Zu diesen Mitgliedsfunktionen gehören für istreamseekg("seek get") und für ostreamseekp("seek put")。

Die Parameter von seekg und seekp sind normalerweise ein long integer. Der zweite Parameter kann verwendet werden, um die Suchrichtung anzugeben. Die Suchrichtung kannios::begsein (standardmäßig Positionierung vom Anfang des Streams aus), oder sie kannios::cur sein(Positionierung von der aktuellen Position im Stream aus), oder sie kannios::endsein (die Positionierung beginnt am Ende des Streams).

Der Dateipositionszeiger ist ein ganzzahliger Wert, der die Anzahl der Bytes vom Anfang der Datei bis zur Position des Zeigers angibt. Das Folgende ist ein Beispiel für die Positionierung des "get"-Dateipositionszeigers:

// Zum n-ten Byte von fileObject springen (ios::beg vorausgesetzt) fileObject.seekg( n ); // Den Datei-Lesezeiger um n Bytes von der aktuellen Position von fileObject rückwärts bewegen fileObject.seekg( n, ios::cur ); // Den Datei-Lesezeiger um n Bytes vom Ende von fileObject zurückbewegen fileObject.seekg( n, ios::end ); // An das Ende von fileObject springen fileObject.seekg( 0, ios::end );
Weitere Erweiterungen