Les Fichiers en C Introduction La communication entre un programme et son environnement s établie par l intermédiaire des fichiers. Le clavier et l écran sont aussi considérés comme fichiers standards, (clavier : fichier d entrée standard, l écran : fichier de sortie standard). Nous avons utilisé ses deux fichiers pour lire et écrire les données utilisées dans un programme, dans ce cours nous allons voir comment nous pouvons créer, lire et écrire dans des fichiers externes. Définitions Un fichier: Un ensemble de données stocké en général sur un support externe (disquette, disque dur, usb,...). Dans des fichiers séquentiels, les enregistrements sont mémorisés consécutivement dans l'ordre de leur entrée et peuvent seulement être lus dans cet ordre. Si on a besoin d'un enregistrement précis dans un fichier séquentiel, il faut lire tous les enregistrements qui le précèdent, en commençant par le premier. Fichiers standards Il existe deux fichiers spéciaux qui sont définis par défaut pour tous les programmes: - stdin le fichier d'entrée standard - stdout le fichier de sortie standard 1
En général, stdin est lié au clavier et stdout est lié à l'écran, c.-à-d. les programmes lisent leurs données au clavier et écrivent les résultats sur l'écran. Intérêt : Mémoriser les données de manières permanente. Les problèmes traitant des fichiers ont généralement la forme suivante: un fichier donné par son nom (et en cas de besoin le chemin d'accès) doit être créé, lu ou modifié. La question qui se pose est alors: Comment pouvons-nous relier le nom d'un fichier sur un support externe avec les instructions qui donnent accès au contenu du fichier? Avant de lire ou d'écrire dans un fichier, l'accès est notifié par la commande fopen. fopen accepte le nom du fichier (p.ex: "C:\Test.txt") et fournit un pointeur spécial qui sera utilisé ensuite lors de l'écriture ou la lecture du fichier. Après les traitements, il faut annuler la liaison entre le nom du fichier et le pointeur à l'aide de la commande fclose. Tout ce que nous avons à faire dans notre programme est: Etapes : - déclarer un pointeur du type FILE* pour chaque fichier dont nous avons besoin, - affecter l'adresse retournée par fopen à ce pointeur, - employer le pointeur à la place du nom du fichier dans toutes les instructions de lecture ou d'écriture, - libérer le pointeur à la fin du traitement à l'aide de fclose. 1. Déclaration du pointeur de type FILE : - FILE * F; - F est un pointeur du type FILE qui sera relié au fichier. Dans la suite du programme, il faut utiliser F au lieu du nom du fichier pour référencer le fichier. 2
2. Ouverture du fichier : F = fopen (Nom_Fichier, Mode); - Nom_Fichier : chaine contenant le nom, le chemin et l extension du fichier. - Mode : chaine indiquant le mode d ouverture du fichier. - F: pointeur de type FILE qui pointe sur le fichier. 3. Fermeture du fichier : fclose(f) ; Modes d ouverture d un fichier: "r" "w" "a" fichier en lecture. fichier en écriture. fichier en écriture à la fin. "r+" fichier en lecture et écriture. "w+" fichier en lecture et écriture. (son contenu sera effacé) "a+" fichier en lecture/écriture à la fin. Lecture formatée: fscanf (pointeur_sur_fichier, "formats", args); Cette fonction lit les valeurs à partir d un fichier pointé par pointeur_sur_fichier et les stocke dans les arguments args selon les formats indiqués. La fonction fscanf déplace le curseur après les valeurs lues. NB : Cette fonction est similaire à scanf, sauf que fscanf lit les données à partir du fichier et scanf lit les données à partir du clavier. Exemple : Lecture à partir d un fichier qui contient des entiers. int a ; FILE * F = fopen("test.txt", "r" ) ; 3
fscanf(f,"%d",&a); print(f,"%d",a) ; Ecriture formatée: fprintf(pointeur_sur_fichier, "formats", args); Cette fonction écrit les valeurs des arguments args dans le fichier pointé par pointeur_sur_fichier selon les formats indiqués. NB : Cette fonction est similaire à scanf, sauf que fprintf écrit les données dans le fichier et scanf affiche les données dans l écran. Exemple : Ecriture d un entier dans un fichier. int a=10 ; FILE * F = fopen("test.txt", "w" ) ; fprintf(f,"%d",a) ; Lecture par caractère: fgetc(pointeur_sur_fichier); Cette fonction lit un caractère à partir du fichier pointé par pointeur_sur_fichier. Valeur de retour (int ) : Si la lecture se fait sans erreur et sans rencontre de la fin du fichier, fgetc rend le caractère lu, sinon rend la valeur EOF. Exemple : Char c ; FILE * F = fopen("test.txt", "r" ) ; While(c=fgetc(F)! =EOF) { /* utilisation de c */ Ecriture par caractère: 4
fputc(caractère,pointeur_sur_fichier); Cette fonction écrit le caractère dans le fichier. Exemple : L'utilisateur doit entrer au clavier le nom du fichier, le nombre de personnes et les noms des personnes. Le programme se chargera de créer le fichier correspondant. Après avoir écrit et fermé le fichier, le programme va rouvrir le même fichier en lecture et afficher son contenu. #include <stdio.h> main() { FILE * F; int nb,i; char Nom_F[30], Pers[30]; printf("entrer le nom du fichier:\n"); scanf("%s",nom_f); F=fopen(Nom_F,"w"); printf("entrer le nombre de personnes:\n"); scanf("%d",&nb); for(i=0;i<nb;i++) { fclose(f); F=fopen(Nom_F,"r"); while(!feof(f)) { fscanf(f,"%s",pers); printf("%s",pers); printf("entrer la personnes %d:\n",i); scanf("%s",pers); fprintf(f,"%s",pers); 5
fclose(f); Remarque: feof (F) retourne une valeur différente de zéro, si la tête de lecture du fichier référencé par F est arrivée à la fin du fichier; sinon la valeur du résultat est zéro. Exercice 1 : Ecrire un programme qui permet de remplir un fichier par des entiers, puis les afficher sur écran. Exercice 2 : Ecrire un programme qui lit le nom et le nombre d habitants de plusieurs villes et les stockent dans un fichier. Exercice 3 : Ecrire un programme qui copie le contenu d un fichier F1 dans un autre fichier F2. Exercice 4 : Ecrire le programme qui lit et affiche un fichier en le parcourant caractère par Caractère. Exercice 5 : Ecrire un programme qui convertit le contenu d un fichier en majuscule. 6
Exercice 6 : On se propose de créer un fichier personnes.txt qui contiendra les informations sur des personnes : Nom, Prenom : chaine de caractères, Matricule : entier. Ecrire un programme qui permet de remplir un fichier par les informations sur des personnes. 7