Les fichiers de texte en C
1. Inclusion
Si vous ne l'avez pas déjà fait pour utiliser
scanf() ou printf(), il faut inclure
<stdio.h>.
2. Déclaration de variable
Pour utiliser un fichier de texte (stocké en général
sur un disque dur) dans un programme, il faut déclarer une variable
d'un type particulier qui "repésentera" ce fichier au sein du programme :
FILE * vf; (vf est le nom de la variable)
3. Ouverture
La déclaration précédente ne fait que déclarer
un pointeur, sans l'initialiser.
L'ouverture d'un fichier consiste à associer un fichier sur disque
à une variable du programme :
vf = fopen( nom_fichier, mode );
où nom_fichier est une chaîne de caractères (constante ou variable)
contenant le chemin d'accès (absolu ou relatif) au fichier disque,
et où mode est une chaîne de caractères valant "r"
(comme "read") si l'on veut lire dans le fichier ou "w" (comme "write")
si l'on veut écrire dans le fichier.
Une autre conséquence de l'ouverture d'un fichier :
- s'il est ouvert en lecture, les accès en écriture sont refusés
à tout autre programme
- s'il est ouvert en écriture, les accès en lecture et en écriture
sont refusés à tout autre programme
4. Test d'ouverture
L'ouverture a pu mal se passer dans plusieurs cas, notamment :
- en lecture, si le fichier n'existe pas
- en lecture, si l'utilisateur n'a pas les droits de lecture sur ce fichier
(ou les droits de traverser un répertoire du chemin d'accès)
- en écriture, si le fichier existe déjà et que l'utilisateur
n'a pas les droits de modification sur ce fichier
- en écriture, si l'utilisateur n'a pas les droits de modification
sur le répertoire contenant le fichier
- en écriture, éventuellement selon les systèmes,
s'il n'y a plus assez de place sur le disque ou si le quota est
insuffisant
Il faut donc tester si l'ouverture s'est bien passée avant de commencer
à lire ou à écrire dans un fichier supposé ouvert :
if ( vf == NULL ) { printf( "Je n'ai pas pu ouvrir %s !\n", nom_fichier ); exit( 1 ); }
5. Lectures / écritures
- 5.1 Lecture
fscanf( vf, "%d", &i ); (comme au clavier; suppose int i;)
Autres manières possibles de lire dans un fichier :
c = fgetc( vf ); (pour lire un seul caractère; suppose char c;)
fgets( tab, MAX, vf ); (pour lire une ligne;
suppose char tab[MAX+1]; où MAX est une constante)
Attention ! Le caractère '\n' de fin de ligne
est laissé dans le tableau tab .
- 5.2 Écriture
fprintf( vf, "( %d )\n", i ); (comme à l'écran;
suppose int i; et i initialisé)
Autres manières possibles d'écrire dans un fichier :
fputc( c, vf ); (pour écrire un seul caractère;
suppose char c; et c initialisé)
fputs( chaîne, vf ); (pour écrire une ligne;
où chaîne est une chaîne de caractères
-- constante ou variable -- initialisée)
6. Test de fin de fichier (en lecture)
Après de nombreuses opérations de lecture dans un fichier de texte,
il se peut qu'il n'y ait plus rien à lire !
On dit alors qu'on a atteint la fin de fichier.
Selon les systèmes, lire au-delà de cette limite peut soit provoquer
une erreur, soit simplement retourner toujours la même donnée.
Il faut donc tester la fin de fichier AVANT chaque lecture
(eh oui, le fichier peut être vide !)
à l'aide de la fonction feof() (end of file) :
while ( ! feof( vf ) )
{
lire dans le fichier
if ( ! feof( vf ) )
traitement des données lues
}
Le test de fin de fichier à l'intérieur de la boucle est utile car feof()
ne retourne VRAI que lorsqu'on a dépassé la fin de fichier.
7. Fermeture
Comme expliqué au paragraphe "ouverture", le fichier est plus ou moins inaccessible
aux autres programmes tant que le fichier reste ouvert.
Il faut donc le fermer le plus tôt possible, c'est-à-dire dès
qu'on n'en a plus besoin par l'instruction :
fclose( vf );
8. Exemples de lectures
Soit un fichier contenant :
On peut envisager 4 manières de le lire :
-
caractère par caractère (c=fgetc(vf);), on obtient :
'1','2','3',' ',' ','4','5','6','\n','7','8','9','\n'
-
mot par mot (fscanf(vf,"%s",tab);), on obtient :
"123","456","789"
-
ligne par ligne (fgets(tab,max,vf);), on obtient :
"123 456\n","789\n"
-
terme par terme (fscanf(vf,"%d",&n);), on obtient :
123,456,789
9. Liens