Académique Documents
Professionnel Documents
Culture Documents
Chapitre 4 E L2 Fichiers PDF
Chapitre 4 E L2 Fichiers PDF
Les Fichiers
I- Les opérations sur les fichiers
Un fichier est un ensemble de données généralement stockées sur le disque d’un ordinateur.
Les données peuvent être enregistrées dans des fichiers, puis réutilisées ultérieurement.
Presque tous les programmes du monde réel utilisent des fichiers pour stocker et récupérer des
données. Voici quelques exemples de progiciels familiers qui utilisent beaucoup les fichiers.
• Traitement de texte : les programmes de traitement de texte sont utilisés pour écrire des
lettres, des mémos, des rapports et d'autres documents. Les documents sont ensuite
enregistrés dans des fichiers pour pouvoir être modifiés et réimprimés.
• Systèmes de gestion de bases de données : les SGBD sont utilisés pour créer et maintenir
des bases de données. Les bases de données sont des fichiers qui contiennent de grandes
collections de données, telles que les enregistrements de paie, les inventaires, les
statistiques des ventes et les enregistrements des clients.
• Feuilles de calcul : les programmes de feuilles de calcul sont utilisés pour travailler avec
des données numériques. Des nombres et des formules mathématiques peuvent être
insérés dans les lignes et les colonnes de la feuille de calcul. La feuille de calcul peut
ensuite être enregistrée dans un fichier pour une utilisation ultérieure.
• Compilateurs : les compilateurs traduisent le code source d'un programme, qui est
enregistré dans un fichier, en un fichier exécutable.
Type de Description
données
ifstream Flux d’entrée de fichiers. Ce type de données ne peut être utilisé que pour
lire les données des fichiers en mémoire.
ofstream Flux de sortie de fichiers. Ce type de données peut être utilisé pour créer des
fichiers et y écrire des données.
fstream Flux de fichiers. Ce type de données peut être utilisé pour créer des fichiers,
y écrire des données et en lire des données.
1- Utilisation du type de données fstream
On définit un objet fstream comme on définit des objets d'autres types de données. L'instruction
suivante définit un objet fstream nommé nouveauFichier.
fstream nouveauFichier;
Comme pour les objets ifstream et ofstream, vous utilisez la fonction open() d'un objet fstream
pour ouvrir un fichier. La fonction ouverte d'un objet fstream nécessite cependant deux
arguments :
• Le premier argument est une chaîne contenant le nom du fichier ;
• Le deuxième argument est un accès au fichier, indicateur qui indique le mode dans
lequel vous souhaitez ouvrir le fichier. Voici un exemple.
nouveauFichier.open ("Dassy.txt", ios ::out);
Le premier argument de cet appel de fonction est le nom du fichier, Dassy.txt. Le deuxième
argument est l'indicateur d'accès au fichier ios::out. Cela indique à C++ d'ouvrir le fichier en
mode de sortie. Le mode de sortie permet d'écrire des données dans un fichier. L'instruction
suivante utilise l'indicateur d'accès ios::in pour ouvrir un fichier en mode d'entrée, ce qui permet
la lecture des données à partir du fichier.
nouveauFichier.open ("Dassy.txt", ios::in);
Il existe de nombreux indicateurs d'accès aux fichiers, comme indiqué dans le tableau ci-
dessous :
Plusieurs indicateurs peuvent être utilisés ensemble. Il suffit de les relier avec l’opérateur | . Par
exemple, supposons que nouveauFichier est un objet fstream dans l'instruction suivante :
nouveauFichier.open ("Dassy.txt", ios::in | ios::out);
Cette instruction ouvre le fichier Dassy.txt dans les modes d'entrée et de sortie. Cela signifie
que les données peuvent être écrites et lues à partir du fichier.
IMPORTANT :
Lorsqu'il est utilisé seul, l'indicateur ios::out provoque la suppression du contenu du fichier si le
fichier existe déjà. Cependant, lorsqu'il est utilisé avec l'indicateur ios::in, le contenu existant du
fichier est conservé. Si le fichier n'existe pas déjà, il sera créé.
L'instruction suivante ouvre le fichier de telle manière que les données ne seront écrites qu'à la
fin :
nouveauFichier.open ("Dassy.txt", ios::out | ios::app);
En utilisant différentes combinaisons d'indicateurs d'accès, vous pouvez ouvrir des fichiers dans
de nombreux modes possibles.
Le programme ci-dessous utilise un objet fstream pour ouvrir un fichier pour la sortie, puis écrit
des données dans le fichier.
Le contenu réel du fichier apparaît sous la forme d'un flux de caractères, comme illustré dans
la Figure ci-dessous :
<E
\ \ \
M C H A T C H U I N M D J O K O M D A S S Y OF
n n n
>
Comme vous pouvez le voir sur la figure, les caractères \n sont écrits dans le fichier avec tous
les autres caractères. Les caractères sont ajoutés au fichier de manière séquentielle, dans l'ordre
où ils sont écrits dans le programme. Le tout dernier caractère est un marqueur de fin de fichier.
C'est un caractère qui marque la fin du fichier et est automatiquement écrit lorsque le fichier est
fermé. (Le caractère réel utilisé pour marquer la fin d'un fichier dépend du système
d'exploitation utilisé. Il s'agit toujours d'un caractère non imprimable. Par exemple, certains
systèmes utilisent control-Z.)
Le programme ci-dessous est une modification du programme ci-dessus qui illustre davantage
la nature séquentielle des fichiers. Le fichier est ouvert, trois noms y sont écrits et il est fermé.
Le fichier est ensuite réouvert par le programme en mode append ou ajout (avec l'indicateur
d’accès ios::app). Lorsqu'un fichier est ouvert en mode append ou ajout, son contenu est
conservé et toutes les sorties ultérieures sont ajoutées à l’envoi du fichier. Deux autres noms
sont ajoutés au fichier avant qu'il ne soit fermé et que le programme se termine.
Si l'indicateur ios::out avait été seul, sans ios::app la deuxième fois que le fichier a été ouvert,
le contenu du fichier aurait été supprimé. Si tel avait été le cas, les noms M CHATCHIN,
DJOKO et Dassy auraient été effacés, et le fichier n'aurait contenu que les noms DEFO et
BANSI.
Vous ne pouvez pas modifier le fait que les fichiers ifstream ne peuvent qu’être lus et les
fichiers ofstream ne peuvent qu’être écrits. Vous pouvez toutefois modifier la manière dont les
opérations sont effectuées sur ces fichiers en fournissant un indicateur d'accès aux fichiers
comme second argument facultatif de la fonction d'ouverture. Le code suivant montre un
exemple utilisant un objet ofstream.
ofstream ecrireFichier;
ecrireFile.open ("Dassy.txt", ios::out | ios::app);
L'indicateur ios::app spécifie que les données écrites dans le fichier Dassy.txt doivent être
ajoutées à son contenu existant.
ifstream lireFichier("DassyL.txt");
ofstream ecrireFichier("DassyE.txt");
ofstream nouveauFichier("DassyLE.txt", ios::out|ios::app);
Vous pouvez également tester les erreurs après avoir ouvert un fichier avec cette technique. Le
code suivant montre un exemple.
ifstream lireFichier ("Dassy.txt");
if (! lireFile)
cout << "Erreur lors de l'ouverture de Dassy.txt. \n";
L'état interne des objets de flux de fichiers change à chaque opération. Ils doivent toujours être
transmis aux fonctions par référence pour garantir la cohérence interne. Le programme 12-5
montre un exemple de la manière dont les objets de flux de fichiers peuvent être passés comme
arguments aux fonctions.
IV- Test d'erreur plus détaillé
Tous les objets de flux ont des bits d'état d'erreur qui indiquent l'état du flux.
Tous les objets de flux contiennent un ensemble de bits qui agissent comme des indicateurs.
Ces indicateurs indiquent l'état actuel du flux. Le tableau ci-dessous répertorie ces bits.
Ces bits peuvent être testés par les fonctions membres répertoriées dans le Tableau
ofstream/ifstream ci-dessus. (Vous avez déjà découvert la fonction fail ().) L'une des fonctions
répertoriées dans le tableau, clear (), peut être utilisée pour définir un bit d'état.
Bit Description
ios::eofbit Défini lorsque la fin d'un flux d'entrée est rencontrée.
ios::failbit Défini lorsqu'une tentative d'opération a échoué.
ios::hardfail Défini lorsqu'une erreur irrémédiable s'est produite.
ios::badbit Défini lorsqu'une opération non valide a été tentée.
ios::goodbit Défini lorsque tous les indicateurs ci-dessus ne sont pas définis. Indique que
le flux est en bon état.
Founction Description
eof() Renvoie true (nonzero) si l'indicateur eofbit est défini, sinon renvoie false.
fail() Renvoie true (différent de zéro) si les indicateurs failbit ou hardfail sont définis,
sinon renvoie false.
bad() Renvoie vrai (différent de zéro) si l'indicateur de badbit est défini, sinon renvoie
faux.
good() Renvoie true (différent de zéro) si l'indicateur goodbit est défini, sinon renvoie
false.
clear() Lorsqu'il est appelé sans argument, efface tous les indicateurs répertoriés ci-
dessus. Peut également être appelé avec un indicateur spécifique comme
argument.
La fonction montreStatus, illustrée ici, accepte une référence de flux de fichier comme
argument. Il montre l'état du fichier en affichant les valeurs de retour des fonctions membres
eof (), fail (), bad () et good ():
Santa Barbara
698086055
s
La figure ci-dessous montre la manière dont les données sont enregistrées dans le fichier.
C H A T C H U I N
D J O K O D A S S
Y \n S a n t a B a
r
b a r a \n 6 9 8 0 8
6 0 5 5 \n <EOF>
Le problème qui découle de l'utilisation de l'opérateur >> est évident dans la sortie du
programme.
1- La fonction getline()
Le problème avec le programme ci-dessus peut être résolu en utilisant la fonction getline(). La
fonction lit une « ligne » de données, y compris des espaces blancs. Voici un exemple de l'appel
de fonction :
getline(nomFichier, str,'\n');
Les trois arguments de cette déclaration sont expliqués comme suit :
• nomFichier : Il s'agit du nom de l'objet de flux de fichiers. Il spécifie l'objet de flux à
partir duquel les données doivent être lues.
• Str : Il s'agit du nom d'un objet chaîne. Les données lues dans le fichier seront stockées
ici.
• '\n' : Ceci est un caractère de délimitation de votre choix. Si ce délimiteur est rencontré,
la fonction arrêtera la lecture. (Cet argument est facultatif. S'il est omis, '\ n' est la valeur
par défaut.)
L'instruction lit une ligne de caractères du fichier. La fonction lira jusqu'à ce qu'elle rencontre
le caractère \n. La ligne de caractères sera stockée dans l'objet str.
Le programme dessous est une modification du programme écrit ci-dessus. Il utilise la fonction
getline() pour lire des lignes entières de données du fichier.
~TP~
Notez que les caractères \n, qui marquent la fin de chaque enregistrement, font également partie
de la sortie. Ils provoquent l'impression d'une ligne vierge supplémentaire à l'écran, séparant les
enregistrements.
REMARQUE : lorsque vous utilisez un caractère imprimable, tel que $, pour délimiter des
données dans un fichier, veillez à sélectionner un caractère qui n'apparaîtra pas réellement dans
les données elles-mêmes. Comme il est douteux que le nom ou l’adresse d’une personne
contienne un caractère $, il s’agit d’un délimiteur acceptable. Si le fichier contenait des
montants en dollars, cependant, un autre délimiteur aurait été choisi.
2- La fonction de membre get()
La fonction membre get() de l’objet de flux de fichiers est également utile. Il lit un seul caractère
du fichier. Voici un exemple de son utilisation :
inFichier.get (ch);
Dans cet exemple, ch est une variable char. Un caractère sera lu dans le fichier et stocké dans
ch. Le programme ci-dessous montre la fonction utilisée dans un programme complet.
L'utilisateur est invité à saisir le nom d'un fichier. Le fichier est ouvert et la fonction get est
utilisée dans une boucle pour lire le contenu du fichier, un caractère à la fois.
Remarque :
La fonction get() lit même les espaces, donc tous les caractères seront affichés
exactement tels qu'ils apparaissent dans le fichier.
Bien que l'accès séquentiel aux fichiers soit utile dans de nombreuses circonstances, il peut
ralentir considérablement un programme. Si le fichier est très volumineux, la localisation des
données enfouies profondément à l'intérieur peut prendre beaucoup de temps. Alternativement,
C++ permet à un programme d'effectuer un accès aléatoire aux fichiers. En accès aléatoire aux
fichiers, un programme peut sauter immédiatement à n'importe quel octet du fichier sans avoir
à lire d'abord les octets précédents. La différence entre l'accès séquentiel et aléatoire aux fichiers
est comme la différence entre une cassette et un disque compact. Lors de l'écoute d'un CD, on
n'a pas besoin d'écouter ou d'avancer rapidement sur des chansons indésirables. Vous passez
simplement à la piste que vous souhaitez écouter.
Accès
séquentiel :
Accès
aléatoire :
~TP~
~TP~