15/03/2007 1 Algorithmique et programmation Chapitre 6 Chapitre 6: Les fichiers

15/03/2007 1 Algorithmique et programmation Chapitre 6 Chapitre 6: Les fichiers séquentiels Chap. 6 Chap. 6: Les fichiers séquentiels o Définition o Fichier Un fichier (angl.: file) est un ensemble structuré de données stocké en général sur un support externe (disquette, disque dur, disque optique, ...). Un fichier structuré contient une suite d'enregistrements homogènes, qui regroupent le plus souvent plusieurs composantes (champs). o 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. 15/03/2007 2 Chap. 6 Chap. 6: Les fichiers séquentiels o En simplifiant, nous pouvons nous imaginer qu'un fichier séquentiel est enregistré sur un disque dur: Chap. 6 Chap. 6: Les fichiers séquentiels o Propriétés Les fichiers séquentiels que nous allons considérer dans ce cours auront les propriétés suivantes: n Les fichiers se trouvent ou bien en état d'écriture ou bien en état de lecture; nous ne pouvons pas simultanément lire et écrire dans le même fichier. n A un moment donné, on peut uniquement accéder à un seul enregistrement; celui qui se trouve en face de la tête de lecture/écriture. n Après chaque accès, la tête de lecture/écriture est déplacée derrière la donnée lue en dernier lieu. 15/03/2007 3 Chap. 6 Chap. 6: Les fichiers séquentiels o 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 o En UNIX et en MS-DOS, il est possible de rediriger l'entrée et la sortie standard vers d'autres fichiers ou périphériques à l'aide des symboles < (pour stdin ) et > (pour stdout) o Exemple L'appel suivant du programme PROG lit les données dans le fichier C:\TEST.TXT au lieu du clavier et écrit les résultats sur l'imprimante au lieu de l'écran. PROG <C:\TEST.TXT >PRN Chap. 6 Chap. 6: Les fichiers séquentiels o La mémoire tampon Pour des raisons d'efficacité, les accès à un fichier se font par l'intermédiaire d'une mémoire tampon (angl.: buffer). C’est ce que l’on appelle la lecture/écriture différée. La mémoire tampon est une zone de la mémoire centrale de la machine réservée à un ou plusieurs enregistrements du fichier. L'utilisation de la mémoire tampon a l'effet de réduire le nombre d'accès à la périphérie d'une part et le nombre des mouvements de la tête de lecture/écriture d'autre part. 15/03/2007 4 Chap. 6 Chap. 6: Les fichiers séquentiels o Accès aux fichiers séquentiels o 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 sur le médium de stockage) 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 ? o Utilisation des deux fonctions fopen et fclose. Chap. 6 Chap. 6: Les fichiers séquentiels o 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. o fopen() accepte le nom du fichier (p.ex: « C:\adresses.dat") en paramètre, négocie avec le système d'exploitation 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(). o On peut dire aussi qu'entre les événements fopen() et fclose() le fichier est ouvert. 15/03/2007 5 Chap. 6 Chap. 6: Les fichiers séquentiels o Le type FILE* o Pour pouvoir travailler avec un fichier, un programme a besoin d'un certain nombre d'informations au sujet du fichier: n adresse de la mémoire tampon, n position actuelle de la tête de lecture/écriture, n type d'accès au fichier: écriture, lecture, ... n état d'erreur,… o 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 (notion de pointeur sur fichier). Chap. 6 Chap. 6: Les fichiers séquentiels o Tout ce que nous avons à faire dans notre programme est: n déclarer un pointeur du type FILE* pour chaque fichier dont nous avons besoin, n affecter l'adresse retournée par fopen à ce pointeur, n employer le pointeur à la place du nom du fichier dans toutes les instructions de lecture ou d'écriture, n libérer le pointeur à la fin du traitement à l'aide de fclose. F I L E * p m o n f i c h i e r ; … p m o n f i c h i e r = f o p e n ( « c : \ \ p o l o . d a t » , « w » ) ; f l o s e ( p m o n f i c h i e r ) ; 15/03/2007 6 Chap. 6 Chap. 6: Les fichiers séquentiels o Ecriture dans un fichier : fprintf A l’instar de l’instruction printf qui permet d’écrire une chaîne de caractère formattée sur la sortie standard, il existe une instruction, qui réalise la même opération sur un fichier o Exemple d’utilisation: f p r i n t f ( p m o n f i c h i e r , " % s \ n " , u n e c h a i n e ) ; o Lecture depuis un fichier : fscanf De même que pour le couple printf/fprintf, il existe le couple scanf/fscanf. fscanf permet la lecture depuis un fichier plutôt que depuis l’entrée standard. fscanf(pmonfichier, "%s\n",unechaine); Chap. 6 Chap. 6: Les fichiers séquentiels o Exercice : Créer et afficher un fichier séquentiel o Avant de discuter les détails du traitement des fichiers, nous vous présentons un petit exemple qui réunit les opérations les plus importantes sur les fichiers. o Problème o 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. o 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 disque dur ou sur disquette. o 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. 15/03/2007 7 Chap. 6 Chap. 6: Les fichiers séquentiels o Ouvrir et fermer des fichiers séquentiels #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"); if (!P_FICHIER) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICHIER); } while (!P_FICHIER); . . . fclose(P_FICHIER); return 0; } if (!P_FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICHIER); exit(-1); /* Abandonner le programme avec retour -1*/ } Chap. 6 Chap. 6: Les fichiers séquentiels o Traitements par enregistrements o Les fichiers texte sont généralement organisés en lignes, c.-à-d. la fin d'une information dans le fichier est marquée par le symbole '\n': o Attention ! o Pour pouvoir lire correctement les enregistrements dans un fichier séquentiel, le programmeur doit connaître l'ordre des différentes rubriques (champs) à l'intérieur des enregistrements. 15/03/2007 8 Chap. 6 Chap. 6: Les fichiers séquentiels o Ecrire dans un fichier séquentiel en langage C - fprintf fprintf( <FP>, "<Form1>\n", <Expr1>); fprintf( <FP>, "<Form2>\n", <Expr2>); ... fprintf( <FP>, "<FormN>\n", <ExprN>); ou bien fprintf(<FP>,"<Form1>\n<Form2>\n...\n<FormN>\n", <Expr1>, <Expr2>, ... , <ExprN>); n * <FP> est un pointeur du type FILE* qui est relié au nom du fichier cible. n * <Expr1>, <Expr2>, ... , <ExprN> représentent les rubriques qui forment un enregistrement et dont les valeurs respectives sont écrites dans le fichier. n * <Form1>, <Form2>, ... , <FormN> représentent les spécificateurs de format pour l'écriture des différentes rubriques Chap. 6 Chap. 6: Les fichiers séquentiels o Comparaisons o L'instruction fprintf(stdout, "Bonjour\n"); est identique à printf("\Bonjour\n"); Attention ! Notez que fprintf (et printf) écrit toutes les chaînes de caractères sans le symbole de fin de chaîne '\0'. Dans les fichiers texte, il faut ajouter le symbole de fin de ligne '\n' pour séparer les données. 15/03/2007 9 Chap. 6 Chap. 6: Les fichiers séquentiels o L'instruction o fscanf(stdin, "%d\n", &N); est identique à scanf("%d\n", &N); Attention ! Pour les fonctions scanf et fscanf tous les signes d'espacement sont équivalents comme séparateurs. En conséquence, à l'aide de fscanf, il nous sera impossible de lire toute une phrase dans laquelle les mots sont séparés uploads/Litterature/ fichiers-sequentiels.pdf

  • 27
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager