Vous êtes sur la page 1sur 14

STRUCTURE DE DONNEES ET ALGORITHMES

FONDAMENTALS

Chapitre 9:
les flots de lecture/écriture sur les fichiers
Semestre I
Niveau 1 Année:
Licence Info
DUT Info IG
DUT Info Maintenance
Sommaire

1. Introduction

2. Manipulation des fichiers

3. Statuts d’erreur sur un flot

4. Conclusion

13/04/2023 2
1. Introduction
Jusqu’ici nous avons parlé des flots d’entrée/sortie standard (cin et cout), le C++ dispose également des flots spécialement conçues
pour réaliser l’échange de données entre les fichiers et le programme :
 ifstream pour la gestion de fichiers en lecture,
 ofstream pour la gestion de fichiers en écriture,
 fstream pour la gestion de fichiers en écriture et en lecture.

Ces flots, qui sont définies dans le fichier d’entête fstream.h, possèdent un certain nombre d’attributs relatifs à la gestion des fichiers :
• une longueur qui correspond au nombre de caractères présents dans le flot (et cela peut être différent du nombre de caractères
contenus dans le fichier),
• un début qui correspond au premier caractère situé dans le flot,
• une fin qui correspond à la position après le dernier caractère dans le flot
• et enfin une position courante qui correspond à la position du caractère qui va être écrit/lu par les opérations sur le flot.

Nous allons maintenant voir plus en détail comment ouvrir et manipuler des fichiers à l’aide des flots.

13/04/2023 3
2. Manipulation des fichiers
 Ouvrir un fichier en lecture seule : ifstream
Pour ouvrir un fichier en lecture seule il vous suffit simplement de créer un objet (variable spécifique) de type ifstream en indiquant,
comme paramètre lors de l’initialisation de la déclaration, le nom du fichier. Sans autre indication de votre part, le fichier est ouvert en
mode texte. Il faut impérativement inclure le fichier d’entête fstream, en plus du fichier iostream.
Dans cet exemple, nous supposons l’existence d’un fichier data.txt dans lequel figure la ligne : J’aime l’algo et le C++

Dans cet exemple, un objet (variable) de type ifstream, nommé MonFichier, est déclaré et initialisé avec un paramètre de type chaîne de
caractère : le nom du fichier à ouvrir.
NB: vous pouvez aussi accédé au fichier data.txt en indiquant son chemin d’accès complet, alors tous les caractères anti slash \ seront
remplacer par les doubles anti slash \\ .

13/04/2023 4
2. Manipulation des fichiers
 Ouvrir un fichier en lecture seule : ifstream
L’affichage provoqué à l’écran est, presque de façon surprenante, le suivant : J’aime. En effet, toute la ligne n’est pas lue dans le fichier
puisque comme pour la classe istream le caractère espace est un séparateur. Ainsi la lecture s’arrête sur ce séparateur.

Comment résoudre ce problème ?

Réponse : on fait appel aux fonctionnalités spécifique des flots d’entrés (fonctions de la classe istream). Nous allons faire appel a la
fonction getline( ) pour supprimer le séparateur espace.

13/04/2023 5
2. Manipulation des fichiers
 Ouvrir un fichier en lecture seule : ifstream
Que se passe-t-il si jamais le fichier n’existait pas ?
Réponse : il ne se passera tout simplement rien. Le fichier ne sera pas créé et la console affichera des caractères aléatoire (du charabia).
le fichier semble avoir été ouvert mais pourtant ce n’est pas le cas et aucune remontée d’exception n’a lieu. Vous devez donc tester, après
ouverture que le fichier est correctement ouvert. Vous avez trois possibilités :

 Utilisez la méthode is_open() de la bibliothèque ifstream. Il vous suffit de tester si l’appel MonFichier.is_open() retourne la
valeur true c-à-d 1. Si c’est le cas le fichier est bien ouvert.

 Utilisez la méthode fail() de la bibliothèque ifstream. Il vous suffit de tester si l’appel MonFichier.fail() retourne la valeur
false c-à-d 0. Si c’est le cas le fichier est bien ouvert.

 Utilisez la surcharge de l’opérateur de négation ! . Il vous suffit de tester si l’appel !MonFichier retourne la valeur false. Si
c’est le cas le fichier est bien ouvert.

NB: le fichier peut être fermé en appelant la fonction close sur le flot. Il peut être également être ouvert en appelant la fonction open.

13/04/2023 6
2. Manipulation des fichiers
 Ouvrir un fichier en écriture : ofstream
Pour ouvrir un fichier en écriture il vous suffit simplement de créer un objet (variable spécifique) de type ofstream en indiquant,
comme paramètre lors de l’initialisation de la déclaration, le nom du fichier. Sans autre indication de votre part, le fichier est ouvert en
mode texte. Il faut impérativement inclure le fichier d’entête fstream, en plus du fichier iostream.

Que se passe-t-il si jamais le fichier n’existait pas ?

Réponse : le fichier data.txt serait quand même créé.

NB: le fichier peut être fermé en appelant la fonction close sur le flot. Il peut être également être ouvert en appelant la fonction open.

13/04/2023 7
2. Manipulation des fichiers
 Paramétrer l’ouverture et la gestion des fichiers
Il est possible en langage C++ de spécifier la façon dont le Liste des masques utilisables dans la gestion des fichiers :
fichier est ouvert. Par défaut, il est ouvert en mode texte
que ce soit en écriture ou en lecture. Pour changer le
mode d’ouverture d’un fichier vous devez passer un
second argument lors de l’initialisation de l’objet (le
premier étant le nom du fichier).

Ce second argument correspond à des valeurs de bits


sur lesquels vous devez faire des masques logiques. La
liste des masques que vous pouvez appliquer, ceux-ci
étant hérités de la classe ios vers les classes ifstream,
ofstream et fstream (ce sont des attributs de la classe ios).

13/04/2023 8
2. Manipulation des fichiers
 Paramétrer l’ouverture et la gestion des fichiers

Ces masques s’utilisent en réalisant un OU logique Il est également possible d’accéder directement à un fichier en

pour changer la valeur du mode d’ouverture par défaut. lecture ou en écriture. Le type (classe) ios fournit des masques

Voici un exemple qui vous illustrera clairement permettant d’exprimer les déplacements à l’intérieur des

comment faire. fichiers. Les valeurs sont indiquées dans le tableau : beg, cur
et end. Ces masques sont utilisés dans les fonctions seekg
(pour le ifstream) et seekp (pour le ofstream) pour préciser un
déplacement dans le fichier ouvert. Il est également possible
de connaître la position courante dans le fichier à l’aide des
méthodes tellg (pour le ifstream) et tellp (pour le ofstream).

Dans cet exemple, le fichier data.txt est ouvert en mode


binaire avec ajout en fin de fichier.

13/04/2023 9
2. Manipulation des fichiers
 Paramétrer l’ouverture et la gestion des fichiers
Dans cet exemple, nous supposons l’existence d’un fichier data.txt dans lequel figure la ligne : J’aime l’algo et le C++

NB:
 la valeur du déplacement indiqué aux méthodes seekp et seekg peut être négatif : dans ce cas cela signifie que vous allez
effectuer un déplacement en remontant dans le fichier. Cette valeur représente le nombre d’octets duquel on se déplace.
 Vous pouvez accéder à d’autres fonctionnalités sur les flots associés aux fichiers en regardant dans l’aide de votre
13/04/2023 environnement de développement les méthodes des classes ifstream et ofstream. 10
3. Statuts d’erreur sur un flot
À chaque flot est associé un ensemble de bits d’erreur. Ces bits, interprétés comme un entier, forment le statut d’erreur du flot. Quatre
valeurs, définies dans la classe ios sont intéressantes.

Si le flot est dans un état d’erreur, les opérations ne peuvent pas s’effectuer tant que l’erreur n’a pas été corrigée (indépendamment du
flot) et que le bit d’erreur correspondant n’a pas été désactivé. Pour réaliser la seconde condition, on dispose de méthodes appartenant à la
classe ios pour connaître la valeur d’un bit, et pour la modifier. Ces méthodes sont les suivantes :

• eof : renvoie l’état du bit eofbit, // eof signifie : end of file


• bad : renvoie l’état du bit badbit,
• fail : renvoie l’état du bit failbit,
• good : renvoie 1 si aucun des trois bits précédents n’est activés,
• rdstate : renvoie le statut d’erreur du flot, //rd pour read
• clear : active le bit passé en paramètre, et met tous les autres à 0. On fixe en fait le statut d’erreur du
flot.
Liste de certains statuts d’erreurs sur les flots

13/04/2023 11
3. Statuts d’erreur sur un flot
Si l’on souhaite activer un bit sans modifier la valeur des autres, on passera en paramètre à la fonction clear le nom du bit à activer et le
résultat de l’appel de la fonction rdstate séparés par le caractère pipe | . Ainsi on affecte l’ancien statut d’erreur plus un bit particulier.
L’état d’erreur d’un flot peut être réinitialisé à 0 à l’aide de la méthode clear.

Dans cet exemple, nous supposons que le fichier data.txt est un fichier vide

Vous remarquerez dans cet exemple que le flag eofbit est testé après
l’opération de lecture. En effet, c’est celle-ci (et non l’ouverture du
fichier) qui provoque la lecture de la fin du fichier (eof).

Il est également possible d’utiliser le mécanisme des exceptions


pour la remontée des erreurs. Par défaut, ce mécanisme n’est pas
activé sur les flots mais peut l’être grâce à l’appel de la méthode
exceptions sur l’objet (variable). Le paramètre accepté par cette
fonction doit être un OU logique des masques associés aux bits pour
lesquels on souhaite une remontée d’exceptions. L’objet levé est
alors du type ios::failure.

13/04/2023 12
3. Statuts d’erreur sur un flot
Reprenons l’exemple précédent.
Dans cet exemple, nous supposons que le fichier data.txt est un fichier vide

La ligne 11 indique au compilateur que les erreurs eofbit et badbit sur l’objet MonFichier doivent être signalées par la levée d’une
exception. C’est ce qui sera fait suite à l’exécution de la ligne 12.

Notez bien que cette possibilité, bien que figurant dans la norme ANSI du C++ n’est pas offerte par tous les compilateurs C++.

13/04/2023 13
Conclusion

Pour plus : Gestion des flots en C++

13/04/2023 14

Vous aimerez peut-être aussi