Leçon 9 Programmer les fichiers I- Les fichiers séquentiels II- Les fichiers te
Leçon 9 Programmer les fichiers I- Les fichiers séquentiels II- Les fichiers textes III- Exercices d'entrainement Bibliographie Les fichiers, organisation et accès Mc BELAID Pages Bleues Internationales Les fichiers séquentiels Faber Frédéric (site web http://www.ltam.lu/fabfr) Langage C et algorithmique Magali Contensin (site web) Programmer les fichiers en Pascal Mc BELAID Pages Bleues Internationales Avant d’aborder la programmation des fichiers, nous vous recomendons de consulter l’ouvrage « Les fichiers, organisation et accès Mc BELAID Pages Bleues Internationales » Qui traite de la notion de fichiers en détails et des supports de stockage et les méthodes d’accès. I- Les fichiers séquentiels En programmation, les communications d’un programme avec les périphériques ( clavier, écran et mémoires externes) se font par l’intermédiaire des fichiers. Les programmes lisent les données dans les fichiers et les écrivent dans les fichiers. 1. Définitions 2. Accès aux fichiers séquentiels 3. Ouvrir et fermer des fichiers séquentiels 4. Lire et écrire dans des fichiers séquentiels 5. Résumé sur les fichiers 6. Mise à jour d'un fichier séquentiel en C 1. Définitions Fichier Un fichier (angl.: file) est un ensemble structuré de données stocké en général sur un support externe (disque dur, disque optique, autres mémoires externes, ...). Un fichier structuré contient une suite d'enregistrements de même types, qui regroupent plusieurs (champs). Fichier séquentiel 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 En général, stdin est lié au clavier et stdout est lié à l'écran, c’est à dire les programmes lisent leurs données au clavier et écrivent les résultats sur l'écran. 2. Accès aux fichiers séquentiels La question qui se pose est alors: Comment accéder à un fichier sur un support externe avec les instructions qui donnent accès au contenu du fichier ? En résumé, la méthode employée sera la suivante: Avant de lire ou d'écrire un fichier, l'accès est notifié par la commande fopen pour ouvrir le fichier en lecture ou en écriture. fopen accepte le nom du fichier (par exemple: "F:\Fichier1.DAT"), le système d'exploitation 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 et le fichier est fermé. 2.1. Le type FILE* Pour pouvoir travailler avec un fichier, un programme a besoin d'un certain nombre d'informations au sujet du fichier: adresse de la mémoire tampon, position actuelle de la tête de lecture/écriture, type d'accès au fichier: écriture, lecture, ... état d'erreur, Ces informations (dont nous n'aurons pas à nous occuper), sont rassemblées dans une structure du type spécial FILE. Lorsque nous ouvrons un fichier avec la commande fopen, le système génère automatiquement un bloc du type FILE et nous fournit son adresse. En C, tout ce que nous avons à faire dans notre programme est: 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. Exemple: Créer et afficher un fichier séquentiel Avant de discuter les détails du traitement des fichiers, nous vous présentons un petit exemple comparatif qui réunit les opérations les plus importantes sur les fichiers. Problème On se propose de créer un fichier qui est formé d'enregistrements contenant comme information le nom d'une personne. Chaque enregistrement est donc constitué d'une seule rubrique, à savoir, le nom de la personne. 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 sur le disque dur. Après avoir écrit et fermé le fichier, le programme va rouvrir le même fichier en lecture et afficher son contenu, sans utiliser le nombre d'enregistrements introduit dans la première partie. En langage algorithmique Algorithme FichierPERS Chaîne NOM_FICHIER, NOM_PERS Entier C,_NB_ENREG (* Première partie : créer et remplir le fichier *) Ecrire ("Entrez le nom du fichier à créer : ") Lire (NOM_FICHIER) Ouvrir (NOM_FICHIER en écriture) Ecrire ("Nombre d'enregistrements à créer : ") Lire (NB_ENREG) C 0 Tant que (C < NB_ENREG) faire début | écrire ("Entrez le nom de la personne : ") | lire (NOM_PERS) | écrire (NOM_FICHIER:NOM_PERS) | C C+1 fin Fermer (NOM_FICHIER) (* Deuxième partie: Lire et afficher le contenu du fichier *) Ouvrir (NOM_FICHIER en lecture) C 0 Tant que non(finfichier(NOM_FICHIER)) faire Début | lire (NOM_FICHIER:NOM_PERS) | écrire ("NOM : ",NOM_PERS) | C C+1 fin Fermer (NOM_FICHIER) Fin. En langage C #include <stdio.h> main() { FILE *P_FICHIER; /* pointeur sur FILE */ char NOM_FICHIER[30], NOM_PERS[30]; int C,NB_ENREG; /* Première partie : Créer et remplir le fichier */ printf("Entrez le nom du fichier à créer : "); scanf("%s", NOM_FICHIER); P_FICHIER = fopen(NOM_FICHIER, "w"); /* write */ printf("Nombre d'enregistrements à créer : "); scanf("%d", &NB_ENREG); C = 0; while (C<NB_ENREG) { printf("Entrez le nom de la personne : "); scanf("%s", NOM_PERS); fprintf(P_FICHIER, "%s\n", NOM_PERS); C++; } fclose(P_FICHIER); /* Deuxième partie : Lire et afficher le contenu du fichier */ P_FICHIER = fopen(NOM_FICHIER, "r"); /* read */ C = 0; while (!feof(P_FICHIER)) { fscanf(P_FICHIER, "%s\n", NOM_PERS); printf("NOM : %s\n", NOM_PERS); C++; } fclose(P_FICHIER); return 0; } 3. Ouvrir et fermer des fichiers en pratique En pratique, il faut contrôler si l'ouverture d'un fichier a été accomplie avec succès avant de continuer les traitements. Pour le cas d'une erreur, nous allons envisager deux réactions différentes: a) Répéter l'essai jusqu'à l'ouverture correcte du fichier #include <stdio.h> main() { FILE *P_FICHIER; /* pointeur sur FILE */ char NOM_FICHIER[30]; /* nom du fichier */ . . . do { printf("Entrez le nom du fichier : "); scanf("%s", NOM_FICHIER); P_FICHIER = fopen(NOM_FICHIER, "w"); /* ou bien */ /* P_FICHIER = fopen(NOM_FICHIER, "r"); */ if (!P_FICHIER) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICHIER); } while (!P_FICHIER); . . . fclose(P_FICHIER); return 0; } b) Abandonner le programme en retournant un code d'erreur non nul - exit #include <stdio.h> #include <stdlib.h> main() { FILE *P_FICHIER; /* pointeur sur FILE */ char NOM_FICHIER[30]; /* nom du fichier */ . . . printf("Entrez le nom du fichier : "); scanf("%s", NOM_FICHIER); P_FICHIER = fopen(NOM_FICHIER, "w"); /* ou bien */ /* P_FICHIER = fopen(NOM_FICHIER, "r"); */ if (!P_FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICHIER); exit(-1); /* Abandonner le programme en */ } /* retournant le code d'erreur -1 */ . . . fclose(P_FICHIER); return 0; } 2.2 Fermer un fichier séquentiel Fermer un fichier en langage C fclose( <PFichier> ); <PFichier> est un pointeur du type FILE* relié au nom du fichier que l'on désire fermer. La fonction fclose provoque le contraire de fopen: Si le fichier a été ouvert en écriture, alors les données non écrites de la mémoire tampon sont écrites et les données supplémentaires (longueur du fichier, date et heure de sa création) sont ajoutées dans le répertoire de stockage. Si le fichier a été ouvert en lecture, alors les données non lues de la mémoire tampon (qui perd son contenu, une fois le programme fini) sont simplement perdues. La mémoire tampon est ensuite libérée et la liaison entre le pointeur sur FILE et le nom du fichier correspondant est annulée. Après fclose() le pointeur <PFichier> est invalide. Des erreurs graves pourraient donc survenir si ce pointeur est utilisé par la suite! 3.1. Ouvrir un fichier séquentiel Lors de l'ouverture d'un fichier avec fopen, le système s'occupe de la réservation de la mémoire tampon dans la mémoire centrale et génère les informations pour un nouvel élément du type FILE. L'adresse de ce bloc est retournée comme résultat si l'ouverture s'est déroulée avec succès. La commande fopen peut ouvrir des fichiers en écriture ou en lecture en dépendance de son deuxième paramètre ("r" ou "w") : <PFichier> = fopen ( <Nom> , "w" ); ou bien <PFichier> = fopen ( <Nom> , "r" ); <Nom> est une chaîne de caractères constante ou une variable de type chaîne qui représente le nom du fichier sur le support de stockage, Le deuxième argument détermine le mode d'accès au fichier: "w" pour 'ouverture en écriture' - write - "r" pour 'ouverture en lecture' - read - * <PFichier> est un pointeur du type FILE* qui sera relié au fichier sur le médium de stockage. Dans la suite du programme, il faut utiliser <PFichier> au lieu de <Nom> pour référencer le fichier. * <PFichier> doit être déclaré comme: FILE *PFichier; Le résultat de fopen Si le fichier a pu être ouvert avec succès, fopen fournit l'adresse d'un uploads/Litterature/ fichires-en-langage-c.pdf
Documents similaires
-
15
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jul 10, 2022
- Catégorie Literature / Litté...
- Langue French
- Taille du fichier 1.5994MB