Fichiers et flux C ++

Jusqu'à présent, nous avons utilisé le iostream bibliothèque standard, qui fournit cin et cout méthodes de lecture depuis l'entrée standard et d'écriture vers la sortie standard respectivement.

Ce didacticiel vous apprendra à lire et à écrire à partir d'un fichier. Cela nécessite une autre bibliothèque C ++ standard appeléefstream, qui définit trois nouveaux types de données -

Sr.Non Type de données et description
1

ofstream

Ce type de données représente le flux de fichier de sortie et est utilisé pour créer des fichiers et pour écrire des informations dans des fichiers.

2

ifstream

Ce type de données représente le flux de fichiers d'entrée et est utilisé pour lire les informations des fichiers.

3

fstream

Ce type de données représente le flux de fichiers en général et a les capacités d'Offstream et d'ifstream, ce qui signifie qu'il peut créer des fichiers, écrire des informations dans des fichiers et lire des informations à partir de fichiers.

Pour effectuer le traitement de fichiers en C ++, les fichiers d'en-tête <iostream> et <fstream> doivent être inclus dans votre fichier source C ++.

Ouverture d'un fichier

Un fichier doit être ouvert avant de pouvoir le lire ou y écrire. Soitofstream ou fstreamobjet peut être utilisé pour ouvrir un fichier à écrire. Et l'objet ifstream est utilisé pour ouvrir un fichier à des fins de lecture uniquement.

Voici la syntaxe standard de la fonction open (), qui est membre des objets fstream, ifstream et ofstream.

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

Ici, le premier argument spécifie le nom et l'emplacement du fichier à ouvrir et le deuxième argument du open() La fonction membre définit le mode dans lequel le fichier doit être ouvert.

Sr.Non Drapeau de mode et description
1

ios::app

Ajouter le mode. Toutes les sorties dans ce fichier doivent être ajoutées à la fin.

2

ios::ate

Ouvrez un fichier pour la sortie et déplacez le contrôle de lecture / écriture à la fin du fichier.

3

ios::in

Ouvrez un fichier à lire.

4

ios::out

Ouvrez un fichier à écrire.

5

ios::trunc

Si le fichier existe déjà, son contenu sera tronqué avant l'ouverture du fichier.

Vous pouvez combiner deux ou plusieurs de ces valeurs en ORles engager ensemble. Par exemple, si vous souhaitez ouvrir un fichier en mode écriture et que vous souhaitez le tronquer au cas où il existe déjà, la syntaxe suivante sera:

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

De la même manière, vous pouvez ouvrir un fichier à des fins de lecture et d'écriture comme suit -

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

Fermer un fichier

Lorsqu'un programme C ++ se termine, il vide automatiquement tous les flux, libère toute la mémoire allouée et ferme tous les fichiers ouverts. Mais il est toujours bon qu'un programmeur ferme tous les fichiers ouverts avant la fin du programme.

Voici la syntaxe standard de la fonction close (), qui est membre des objets fstream, ifstream et ofstream.

void close();

Ecrire dans un fichier

Lors de la programmation C ++, vous écrivez des informations dans un fichier à partir de votre programme à l'aide de l'opérateur d'insertion de flux (<<) tout comme vous utilisez cet opérateur pour afficher des informations à l'écran. La seule différence est que vous utilisez unofstream ou fstream objet au lieu du cout objet.

Lecture à partir d'un fichier

Vous lisez les informations d'un fichier dans votre programme en utilisant l'opérateur d'extraction de flux (>>) tout comme vous utilisez cet opérateur pour saisir des informations à partir du clavier. La seule différence est que vous utilisez unifstream ou fstream objet au lieu du cin objet.

Exemple de lecture et d'écriture

Voici le programme C ++ qui ouvre un fichier en mode lecture et écriture. Après avoir écrit les informations saisies par l'utilisateur dans un fichier nommé afile.dat, le programme lit les informations du fichier et les affiche à l'écran -

#include <fstream>
#include <iostream>
using namespace std;
 
int main () {
   char data[100];

   // open a file in write mode.
   ofstream outfile;
   outfile.open("afile.dat");

   cout << "Writing to the file" << endl;
   cout << "Enter your name: "; 
   cin.getline(data, 100);

   // write inputted data into the file.
   outfile << data << endl;

   cout << "Enter your age: "; 
   cin >> data;
   cin.ignore();
   
   // again write inputted data into the file.
   outfile << data << endl;

   // close the opened file.
   outfile.close();

   // open a file in read mode.
   ifstream infile; 
   infile.open("afile.dat"); 
 
   cout << "Reading from the file" << endl; 
   infile >> data; 

   // write the data at the screen.
   cout << data << endl;
   
   // again read the data from the file and display it.
   infile >> data; 
   cout << data << endl; 

   // close the opened file.
   infile.close();

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les exemples d'entrée et de sortie suivants -

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

Les exemples ci-dessus utilisent des fonctions supplémentaires de l'objet cin, comme la fonction getline () pour lire la ligne de l'extérieur et la fonction ignore () pour ignorer les caractères supplémentaires laissés par l'instruction de lecture précédente.

Pointeurs de position de fichier

Tous les deux istream et ostreamfournissent des fonctions membres pour repositionner le pointeur de position de fichier. Ces fonctions membres sontseekg ("seek get") pour istream et seekp ("chercher") pour ostream.

L'argument de seekg et seekp est normalement un entier long. Un deuxième argument peut être spécifié pour indiquer la direction de recherche. La direction de recherche peut êtreios::beg (par défaut) pour le positionnement par rapport au début d'un flux, ios::cur pour le positionnement par rapport à la position actuelle dans un ruisseau ou ios::end pour le positionnement par rapport à la fin d'un flux.

Le pointeur de position de fichier est une valeur entière qui spécifie l'emplacement dans le fichier sous la forme d'un nombre d'octets à partir de l'emplacement de départ du fichier. Quelques exemples de positionnement du pointeur de position de fichier "get" sont -

// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );

// position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );

// position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );

// position at end of fileObject
fileObject.seekg( 0, ios::end );