Cours Fichiers 2013
Transcription
Cours Fichiers 2013
Fichiers Introduction Fichier texte Présentation Le type TEXT Primitives de gestion Exemple Fichier structuré Présentation Le type FILE OF Primitives de gestion Exemple Compléments d’algorithmique 1 Introduction Définition (Fichier) : Un fichier est une structure de données contenant une suite d’éléments en mémoire secondaire. Suite : Les éléments sont rangés dans un ordre bien précis. Mémoire secondaire : Stockage sur support physique pour la conservation des données. Disque dur, disquette, clé USB, etc. Utilisation : On stocke des données dans un fichier (plutôt qu’en mémoire vive) quand on souhaite conserver ces données. Les données stockées en mémoire (vive) sont perdues quand le programme se termine, alors que les données stockées en mémoire secondaire sont conservées. Compléments d’algorithmique Fichiers : introduction 2 Introduction : avantages Conserver des données, avec possibilité de les copier sur d’autres supports pour sauvegarde. Stockage de grandes quantités de données : plusieurs méga-octets (2201 million) ou giga-octets (230 1 milliard) La taille d’un fichier n’est pas fixée a priori, et peut varier en cours d’utilisation. Facilite la mise au point d’un programme qui demande des données en entrée. Plutôt que de saisir ces données à chaque exécution, les données sont lues dans le fichier. Compléments d’algorithmique Fichiers : introduction 3 Introduction : Nom physique Définition (Nom physique) : Tout fichier a un nom physique qui identifie de façon unique le fichier, et donne son lieu de stockage. Ce nom physique est une chaîne de caractères. La forme du nom physique peut varier selon le système d’exploitation. Sous Unix/Linux : /<nomrepertoire>/<nomsousrep>/.../<nomfichier> Exemple: /home/user/ChosesAFaire Sous Windows : <Lecteur>:\<nomrep>\<nomsousrep>\...\<nomfic>.<ext> Exemple: A:\cours\complementAlgo.txt Le lecteur (une lettre) donne l’unité de stockage. Ex: C: disque dur principal, D: disque dur secondaire, E: DVD, F: USB... L’extension décrit le type de fichier (txt pour un fichier texte, pas pour un fichier source Pascal, exe pour un programme exécutable…). Pour éviter les problèmes : ne pas utiliser de caractère « espace », caractère accentué ou caractère spécial (; + * ? . . . ) dans les noms de fichiers ou de répertoires Compléments d’algorithmique Fichiers : introduction 4 Introduction : accès/position courante Définition (Accès séquentiel) : Chaque élément du fichier est lu en séquence, c’est à dire dans l’ordre d’apparition dans le fichier. Définition (Accès direct) : Chaque élément du fichier peut être lu directement, quelle que soit sa place dans le fichier. Pour lire l’élément n, on doit lire tous les éléments numérotés 1 à n − 1. Un tableau est une structure de données à accès direct. L’accès direct est souvent préférable, car plus performant. Mais dans certains cas (pour lire la totalité du fichier par exemple), l’accès séquentiel suffit. Définition (Position courante dans le fichier) : La position courante dans un fichier est le numéro du prochain élément qui sera lu ou écrit dans le fichier. On parle parfois de tête de lecture/écriture. Il s’agit de la même idée qu’une variable qui contient l’indice dans un tableau. Compléments d’algorithmique Fichiers : introduction 5 Fichier texte : présentation Un fichier texte est un fichier qui contient du texte, c’est à dire : un ensemble de caractères (lettres, chiffres, symboles spéciaux) organisé en lignes. Chaque ligne est terminée par une marque de fin de ligne eoln (end of line). Un fichier texte est terminé par une marque de fin de fichier eof (end of file). Un fichier texte peut être créé et lu dans un traitement de texte (en utilisant la sauvegarde en « texte brut ») ou dans un éditeur de texte (tel que l’éditeur de Lazarus, Delphi ou EDI Pascal).Compléments Compléments d’algorithmique Fichier texte 6 Le type TEXT Le langage Pascal permet de créer, lire, écrire des fichiers textes. Pour manipuler un fichier texte en Pascal, on déclare une variable d’un type spécifique : le type TEXT. Définition (Nom logique) : Le nom logique d’un fichier est la variable de type TEXT qui permet de manipuler le fichier. (par opposition au nom physique qui est une chaîne de caractères qui donne l’emplacement du fichier) Définition (Primitives de gestion) : Toutes les manipulations sur un fichier se font par des appels à des sous-programmes, appelés primitives de gestion, qui prennent comme paramètre le nom logique du fichier. Compléments d’algorithmique Fichier texte 7 Primitives de gestion Ces primitives de gestion concernent : La gestion de fichiers Ouverture, (pour lire ou écrire dans un fichier, il est nécessaire de l’ouvrir) Fermeture, (quand on a fini d’utiliser un fichier, il peut être fermé) . . . L’utilisation de fichiers Lecture, Écriture, . . .ments Compléments d’algorithmique Fichier texte 8 Primitives de gestion Soit f une variable de type TEXT, nom logique du fichier. Soit nomf une expression de type string contenant le nom physique du fichier. Primitive d’association : fait le lien entre le nom physique et le nom logique. Une fois que l’association est faite, les autres primitives peuvent être utilisées sur le nom logique. Syntaxe : f: TEXT; Fnom: string; … Assign(f, fnom); Le nom physique n’est utilisé par aucune autre primitive. Par la suite, f sera le nom logique du fichier à traiter. Compléments d’algorithmique Fichier texte 9 Primitives de gestion Si le fichier n’existe pas sur le support physique, le fichier est créé à vide, sinon, il est vidé de son contenu. Après rewrite, on peut uniquement écrire dans le fichier. Ouverture en exploitation Syntaxe : rewrite(f); Ouverture en création Syntaxe : reset(f); Ouvre le fichier. Si le fichier n’existe pas, une erreur se produit. Positionne la tête de lecture sur le premier caractère du fichier. Après un appel à reset, on peut uniquement lire dans le fichier. Ouverture en ajout Syntaxe :laappend(f); Ouvre le fichier, et positionne tête d’écriture sur la marque de fin de fichier, afin d’écrire de nouveaux éléments dans le fichier. Après append, on peut uniquement écrire dans le fichier. Compléments d’algorithmique Fichier texte 10 Primitives de gestion Fin de ligne Fonction qui retourne un booléen eoln retourne vrai si et seulement si la tête de lecture est sur une marque de fin de ligne (ou sur la marque de fin de fichier). Fin de fichier Syntaxe : eoln(f); Syntaxe : eof(f); Fonction qui retourne un booléen eof retourne vrai si et seulement si la tête de lecture est sur la marque de fin de fichier. Fermeture du fichier Syntaxe : close(f); Ferme le fichier (quel que soit le mode d’ouverture utilisé) Compléments d’algorithmique Fichier texte 11 Primitives de gestion Écriture Écrit un texte dans le fichier. expr est une expression de type caractère, booléen, entier, réel ou chaîne de caractères. Le fichier doit être préalablement ouvert dans un mode qui permet l’écriture (append ou rewrite) Écriture avec fin de ligne Syntaxe : write(f,expr); Syntaxe : writeln(f,expr); Ecrit un texte dans le fichier. Après le texte, la primitive rajoute une marque de fin de ligne au fichier. Il est équivalent d’écrire : write(f,ex); writeln(f); et writeln(f,ex); Paramètres Comme dans le cas de l’écriture à l’écran, write et writeln dans des fichiers peuvent prendre plus de paramètres : write(f,ex1,ex2); write(f,ex1); write(f,ex2); Compléments d’algorithmique 12 Fichier texte Primitives de gestion Lecture Lecture d’un caractère Pour lire dans un fichier, la tête de lecture ne doit pas être sur la marque de fin de fichier, et le fichier doit être ouvert en lecture (reset). Syntaxe : read(f,x); x est une variable de type char. Lit le caractère situé sous la tête de lecture, et le stocke dans x. La tête de lecture est avancée d’un caractère. Lecture d’un entier (idem pour un réel) Syntaxe : read(f,x); x est une variable de type integer. Lit l’entier situé dans le fichier à partir de la position donnée par la tête de lecture, et le stocke dans x. Espaces, tabulations, fin de lignes sont ignorés avant la lecture de l’entier. Si il n’y a pas d’entier trouvé, erreur à l’exécution. Après l’exécution de la primitive, la tête de lecture est positionnée juste après l’entier. Compléments d’algorithmique Fichier texte 13 Primitives de gestion Exemple (fichier.txt) : 15 12 42 blabla ml-abc63texte autre_texte Exemple (lecture) : program test; var f: TEXT; e: integer; s: string; begin assign(f, ’fichier.txt’); reset(f); read(f, e); writeln(e); read(f, e); writeln(e); read(f, e); writeln(e); end. Compléments d’algorithmique Fichier texte 14 Primitives de gestion Lecture d’une chaîne Syntaxe : read(f,x); x est une variable de type string Lit les caractères dans le fichier à partir de la position de la tête de lecture, jusqu’à la prochaine marque de fin de ligne. Les caractères lus sont stockés dans x. La tête de lecture est ensuite positionnée sur la marque de fin de ligne. read permet de lire tout type de chaîne. Si on rajoute read(f, s) au programme précédent, s prend la valeur ’blabla’. Lecture d’une fin de ligne Ignore la marque de fin de la ligne courante. La tête de lecture est déplacée jusqu’au caractère suivant la prochaine fin de ligne. Les caractères qui prédèdent la fin de ligne sont ignorés. Lecture dans une variable + fin de ligne Syntaxe : readln(f,x); Syntaxe : readln(f); Équivalent à read(f,x); readln(f); Read,readln: nbre variable de paramètres. Ex : read(f,v1,v2); Compléments d’algorithmique Fichier texte 15 Primitives de gestion : exemple On désire lire le fichier (etud.txt) ci-dessous pour extraire les noms des étudiants inscrits en L1, et stocker ces noms dans un fichier nommé etudl1.txt. Le fichier etud.txt contient, pour chaque étudiant, sur des ligne séparées : le nom, la formation, l’année de première inscription à l’université. Exemple (etud.txt) : Dupont Alexis L1 2008 Azerty Caroline L2 2006 Qwerty Bob L1 … Compléments d’algorithmique Exemple (etudl1.txt) : Dupont Alexis Qwerty Bob … Fichier texte 16 Primitives de gestion : exemple Exemple : program fich_etud; var entree, sortie: TEXT; nom, formation: string; annee: integer; begin assign(entree, ’etud.txt’); reset(entree); assign(sortie, ’etudl1.txt’); rewrite(sortie); while not(eof(entree)) do begin readln(entree, nom); readln(entree, formation); readln(entree, annee); if formation = ’L1’ then writeln(sortie, nom); end; close(sortie); close(entree); end. Compléments d’algorithmique Fichier texte 17 Fichier structuré : présentation Un fichier structuré est un fichier qui contient des éléments de même type. Le type des éléments peut être : Simple (entier, chaine, etc.) Ex: Stocker des relevés de températures : les éléments sont des real. Composé (enregistrement, tableau) type Etudiant = record nom : string[20]; Ex: Un fichier contenant des formation : string[20]; enregistrements, pour stocker annee : integer; des informations sur les étudiants : end; Fichier dont les éléments sont des enregistrements de type Etudiant Un fichier structuré …est terminé par une marque de fin de fichier eof. …ne peut pas être édité avec un éditeur ou traitement de texte. Compléments d’algorithmique Fichier structuré 18 Fichier structuré : le type FILE OF L’exploitation d’un fichier structuré se fait par l’intermédiaire d’une variable d’un type particulier, appelée nom logique. Comme pour un fichier texte Habituellement, quand on doit manipuler des types dont la définition est complexe (tableau, enregistrement), on utilise une déclaration de type. Syntaxe : type NomType = FILE OF TypeElement; Après cette déclaration de type, on peut déclarer des variables de type NomType, qui seront des noms logiques de fichiers structurés dont les éléments seront tous des TypeElement. Syntaxe : var f1, f2: NomType; Compléments d’algorithmique Fichier structuré 19 Fichiers structurés : primitives de gestion Association : Syntaxe : assign(f,nomf); Soit f une variable de type FILE OF TypeElement, nom logique du fichier à traiter. Soit nomf une expression de type string contenant le nom physique du fichier. Syntaxe : comme sur un fichier texte! Par la suite, f sera le nom logique du fichier à traiter. Ouverture en création Syntaxe : rewrite(f); Exactement comme sur un fichier texte, mais permet lecture ET écriture. Syntaxe : reset(f); Ouverture en exploitation Exactement comme sur un fichier texte, positionne la tête de lecture/écriture sur le premier élément du fichier, et permet lecture ET écriture. Il n’est pas possible d’utiliser append sur un fichier structuré. Compléments d’algorithmique Fichier structuré 20 Fichiers structurés : primitives de gestion Il n’y a pas de fin de ligne dans un fichier structuré, eoln ne peut pas être utilisé. Fin de fichier Exactement comme sur un fichier texte Syntaxe : eof(f); Fermeture du fichier Exactement comme sur un fichier texte Syntaxe : close(f); Compléments d’algorithmique Fichier structuré 21 Fichiers structurés : primitives de gestion Écriture Syntaxe : write(f,expr); f est une variable de type FILE OF TypeElement et expr une expression de type TypeElement Si la tête de lecture/écriture est positionnée sur la marque de fin de fichier: la valeur de expr est écrite à la place de la marque de fin, la marque de fin est placée après ce nouvel élément. la tête de lecture est positionnée sur la marque de fin. Sinon : la valeur de expr est écrite à la place de la valeur située sous la tête de lecture/écriture, la tête de lecture est avancée sur l’élément suivant. Il n’y a pas de fin de ligne dans un fichier structuré, writeln ne doit pas être utilisé.Compléments d’algorithmique Compléments d’algorithmique Fichier structuré 22 Fichiers structurés : primitives de gestion Lecture Syntaxe : read(f,x); f est une variable de type FILE OF TypeElement x une variable de type TypeElement. Une copie de l’élément situé sous la tête de lecture est stockée dans x. La tête de lecture est avancée jusqu’à l’élément suivant. Pour lire dans un fichier, la tête de lecture ne doit pas être sur la marque de fin de fichier. Compléments d’algorithmique Fichier structuré 23 Fichiers structurés : primitives de gestion Taille fonction qui retourne un entier (longint) qui est le nombre d’éléments du fichier f. Position Syntaxe : filesize(f); Syntaxe : filepos(f); fonction qui retourne un entier (longint) qui est le numéro de l’élément du fichier f situé sous la tête de lecture/écriture. Les éléments sont numérotés de 0 à filesize(f) - 1. Positionnement Syntaxe : seek(f,pos); pos est un entier compris entre 0 et le nombre d’éléments du fichier f. Si 0 pos < filesize(f), positionne la tête de lecture/écriture sur l’élément numéro pos. Si pos = filesize(f), positionne la tête de lecture/écriture sur la marque de fin de fichier. Sinon, erreur à l’exécution.nts Compléments d’algorithmique 24 Fichier structuré Exemple: présentation On désire gérer les listes d’inscriptions d’étudiants à des formations. Pour chaque étudiant on doit mémoriser numéro INE, nom, formation. Le programme doit disposer des fonctions suivantes : Saisie d’un étudiant et sauvegarde. Affichage des étudiants inscrits. Recherche d’un étudiant par son numéro INE : Est-ce que cet étudiant existe dans la base ? Quel est le nom et la formation de l’étudiant ? Trier les étudiants par leur numéro INE. Compléments d’algorithmique Fichier structuré 25 Exemple : types Exemple : program baseetud; type Etudiant = record ine : integer; nom : string[20]; formation : string[20]; end; type FichierEtudiant = file of Etudiant; Compléments d’algorithmique Fichier structuré 26 Exemple : Saisie et sauvegarde Exemple : procedure saisie(var e: Etudiant); begin write(’ine ? ’); readln(e.ine); write(’nom ? ’); readln(e.nom); write(’formation ? ’); readln(e.formation); end; /* Ajoute l’etudiant e dans le fichier f */ procedure ajouter(var f: FichierEtudiant; e: Etudiant); begin seek(f, filesize(f)); write(f, e); end; Compléments d’algorithmique Fichier structuré 27 Exemple : Affichage Exemple : /* Affiche a l’ecran le contenu du fichier f */ procedure afficher(var f: FichierEtudiant); var e: Etudiant; begin seek(f, 0); while not(eof(f)) do begin read(f, e); writeln(e.ine, ’ ’, e.nom, ’ ’, e.formation); end; end; Compléments d’algorithmique Fichier structuré 28 Exemple: Recherche d’un étudiant Est-ce que cet étudiant existe dans la base ? Quel est le nom et la formation de l’étudiant ? Ce qui est commun aux deux modes de recherche : Parcours du fichier et arrêt quand l’étudiant est trouvé. /* Positionne la tete de lecture de f sur l’etudiant ine, ou sur eof si l’etudiant est introuvable. */ procedure positionSur(var f:FichierEtudiant; ine:integer); var e: Etudiant; trouve: boolean; begin trouve := false; seek(f, 0); while not(trouve) and not(eof(f)) do begin read(f, e); if e.ine = ine then trouve := true; end; if trouve then seek(f, filepos(f)-1); end; Compléments d’algorithmique Fichier structuré 29 Exemple: Recherche d’un étudiant function appartient(var f: FichierEtudiant; ine: integer): boolean; begin positionSur(f, ine); appartient := not(eof(f)); end; /* Stocke dans resultat les informations sur l’etudiant ine de f. Precondition : f doit contenir un etudiant dont le numero est ine. */ procedure charger(var f: FichierEtudiant; ine: integer; var resultat: Etudiant); begin positionSur(f, ine); read(f, resultat); end; Passage de paramètres Pour passer un fichier comme paramètre à un sous-programme, le fichier doit être passé en paramètre donnée modifiée var. Même dans une fonction. Compléments d’algorithmique Fichier structuré 30 Exemple : Trier les étudiants procedure trier(var f: FichierEtudiant); var i, j, taille, indicemin, inemin : integer; etudianti, etudiantj : Etudiant; begin taille := filesize(f); for i := 0 to taille-1 do begin seek(f, i); read(f, etudianti); indicemin := i; inemin := etudianti.ine; for j := i+1 to taille-1 do begin read(f, etudiantj); if etudiantj.ine < inemin then begin inemin := etudiantj.ine; indicemin := j; end; end; if indicemin <> i then echanger(f, i, indicemin); end; end; Compléments d’algorithmique Fichier structuré 31 Exemple : Trier les étudiants /* Echange dans f les elements i et j */ procedure echanger(var f: FichierEtudiant; i, j: integer); var eti, etj: Etudiant; begin seek(f, i); read(f, eti); seek(f, j); read(f, etj); seek(f, j); write(f, eti); seek(f, i); write(f, etj); end; Compléments d’algorithmique Fichier structuré 32 Exemple : programme principal var f: FichierEtudiant; et: Etudiant; begin assign(f, ’etudiant.dat’); /* rewrite(f); Pour creer le fichier */ reset(f); /* Pour ouverture du fichier existant */ /* Ajout d’un etudiant */ saisie(et); ajouter(f, et); /* Affichage */ afficher(f); writeln(inscrits(f, ’l1’), ’ inscrits en l1’); /* Affichage du nom de l’etudiant d’INE 67 */ charger(f, 67, et); writeln(et.nom); /* Affichage du tri */ trier(f); afficher(f); close(f); end. Compléments d’algorithmique Fichier structuré 33