File I/O in C++ Beheersen: Lezen en Schrijven met fstream
Tot nu toe hebben we de iostream standaardbibliotheek gebruikt, die cin en cout methoden biedt voor het lezen van standaardinvoer en schrijven naar standaarduitvoer respectievelijk.
Deze tutorial leert u hoe u van een bestand kunt lezen en schrijven. Dit vereist een andere standaard C++ bibliotheek genaamd fstream, die drie nieuwe datatypen definieert:
| Nr. | Datatype & Beschrijving |
|---|---|
| 1 | ofstream Dit datatype vertegenwoordigt de output file stream en wordt gebruikt om bestanden te creëren en informatie naar bestanden te schrijven. |
| 2 | ifstream Dit datatype vertegenwoordigt de input file stream en wordt gebruikt om informatie van bestanden te lezen. |
| 3 | fstream Dit datatype vertegenwoordigt de file stream in het algemeen, en heeft de mogelijkheden van zowel ofstream als ifstream, wat betekent dat het bestanden kan creëren, informatie naar bestanden kan schrijven, en informatie van bestanden kan lezen. |
Om bestandsverwerking in C++ uit te voeren, moeten header files <iostream> en <fstream> in uw C++ bronbestand opgenomen worden.
Een Bestand Openen
Een bestand moet geopend worden voordat u ervan kunt lezen of ernaartoe kunt schrijven. Ofwel ofstream of fstream object kan gebruikt worden om een bestand te openen voor schrijven. En ifstream object wordt gebruikt om een bestand te openen alleen voor lezen.
Hier is de standaardsyntax voor de open() functie, die een lid is van fstream, ifstream, en ofstream objecten.
void open(const char *filename, ios::openmode mode);
Hier specificeert het eerste argument de naam en locatie van het te openen bestand en het tweede argument van de open() lidfunctie definieert de modus waarin het bestand geopend moet worden.
| Nr. | Mode Flag & Beschrijving |
|---|---|
| 1 | ios::app Append modus. Alle output naar dat bestand wordt aan het einde toegevoegd. |
| 2 | ios::ate Open een bestand voor output en verplaats de read/write controle naar het einde van het bestand. |
| 3 | ios::in Open een bestand voor lezen. |
| 4 | ios::out Open een bestand voor schrijven. |
| 5 | ios::trunc Als het bestand al bestaat, zal de inhoud getruncateerd worden vóór het openen van het bestand. |
U kunt twee of meer van deze waarden combineren door ze met OR te combineren. Bijvoorbeeld, als u een bestand in schrijfmodus wilt openen en het wilt truncaten voor het geval dat het al bestaat, zal de syntax als volgt zijn:
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );
Op een vergelijkbare manier kunt u een bestand openen voor lezen en schrijven als volgt:
fstream afile;
afile.open("file.dat", ios::out | ios::in );
Een Bestand Sluiten
Wanneer een C++ programma terminaat, fluushed het automatisch alle streams, geeft alle toegewezen geheugen vrij en sluit alle geopende bestanden. Maar het is altijd een goede praktijk dat een programmeur alle geopende bestanden sluit vóór programma terminatie.
Hier is de standaardsyntax voor de close() functie, die een lid is van fstream, ifstream, en ofstream objecten.
void close();
Naar een Bestand Schrijven
Tijdens C++ programmeren, schrijft u informatie naar een bestand vanuit uw programma met behulp van de stream insertion operator (<<) net zoals u die operator gebruikt om informatie naar het scherm te outputten. Het enige verschil is dat u een ofstream of fstream object gebruikt in plaats van het cout object.
Van een Bestand Lezen
U leest informatie van een bestand in uw programma met behulp van de stream extraction operator (>>) net zoals u die operator gebruikt om informatie van het toetsenbord te inputten. Het enige verschil is dat u een ifstream of fstream object gebruikt in plaats van het cin object.
Lees en Schrijf Voorbeeld
Hier volgt het C++ programma dat een bestand opent in lees- en schrijfmodus. Na het schrijven van informatie ingevoerd door de gebruiker naar een bestand genaamd afile.dat, leest het programma informatie van het bestand en output het op het scherm:
Live Demo #include <fstream>
#include <iostream>
using namespace std;
int main () {
char data[100];
// open een bestand in schrijfmodus.
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
// schrijf ingevoerde data in het bestand.
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// weer schrijf ingevoerde data in het bestand.
outfile << data << endl;
// sluit het geopende bestand.
outfile.close();
// open een bestand in leesmodus.
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
// schrijf de data op het scherm.
cout << data << endl;
// lees de data weer van het bestand en toon het.
infile >> data;
cout << data << endl;
// sluit het geopende bestand.
infile.close();
return 0;
}
Wanneer de bovenstaande code gecompileerd en uitgevoerd wordt, produceert het de volgende voorbeelduitvoer en invoer:
$./a.out Writing to the file Enter your name: Zara Enter your age: 9 Reading from the file Zara 9
Bovenstaande voorbeelden maken gebruik van additionele functies van cin object, zoals getline() functie om de regel van buitenaf te lezen en ignore() functie om de extra karakters genegeerd te laten door de vorige read statement.
Bestandspositie Pointers (File Position Pointers)
Zowel istream als ostream bieden lidfuncties voor het herpositioneren van de bestandspositie pointer. Deze lidfuncties zijn seekg ("seek get") voor istream en seekp ("seek put") voor ostream.
Het argument voor seekg en seekp is normaal een long integer. Een tweede argument kan gespecificeerd worden om de zoekrichting aan te geven. De zoekrichting kan ios::beg (de standaard) zijn voor positionering relatief tot het begin van een stream, ios::cur voor positionering relatief tot de huidige positie in een stream of ios::end voor positionering relatief tot het einde van een stream.
De bestandspositie pointer is een integer waarde die de locatie in het bestand specificeert als een aantal bytes vanaf de startlocatie van het bestand. Enkele voorbeelden van het positioneren van de "get" bestandspositie pointer zijn:
// positioneer op de n-de byte van fileObject (veronderstelt ios::beg) fileObject.seekg( n ); // positioneer n bytes vooruit in fileObject fileObject.seekg( n, ios::cur ); // positioneer n bytes terug vanaf einde van fileObject fileObject.seekg( n, ios::end ); // positioneer aan einde van fileObject fileObject.seekg( 0, ios::end );
C Taal
- Wat Is Een Schruif? Uw Complete Gids voor Het Essentiële Hout- en Metaalbewerkingsgereedschap
- C++ Structuren vs Classes: Een praktische gids voor embedded-ontwikkelaars
- C++ variabelen, literalen en constanten: een uitgebreide gids
- C++ klassen & objecten: praktische gids voor object-georiënteerd programmeren
- C++ Geheugenbeheer meesteren: Expert gebruik van new en delete
- C++ Friend Functies en Friend Classes: Toegangscontrole Beheersen
- C Bestandsbehandeling: I/O onder de knie krijgen met fopen, fprintf, fread en fseek
- C Header-bestanden begrijpen: Typen, gebruik en best practices
- Uitgebreide Gids voor Datum en Tijd in C++
- C++ Overloading Beheersen: Functies & Operators Uitgelegd
- Python-directory en bestandsbewerkingen beheersen