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. Fichiers : introduction Compléments d algorithmique 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 (2 20 1 million) ou giga-octets (2 30 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. Fichiers : introduction Compléments d algorithmique 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 Fichiers : introduction Compléments d algorithmique 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. Pour lire l élément n, on doit lire tous les éléments numérotés 1 à n 1. Définition (Accès direct) : Chaque élément du fichier peut être lu directement, quelle que soit sa place dans le fichier. 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. Fichiers : introduction Compléments d algorithmique 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 Fichier texte Compléments d algorithmique 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. Fichier texte Compléments d algorithmique 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 Fichier texte Compléments d algorithmique 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. Fichier texte Compléments d algorithmique 9
Primitives de gestion Ouverture en création 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 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 : rewrite(f); Syntaxe : reset(f); Syntaxe : append(f); Ouvre le fichier, et positionne la 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. Fichier texte Compléments d algorithmique 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 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 : eoln(f); Syntaxe : eof(f); Syntaxe : close(f); Ferme le fichier (quel que soit le mode d ouverture utilisé) Fichier texte Compléments d algorithmique 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 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 Syntaxe : write(f,expr); Syntaxe : writeln(f,expr); 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); Fichier texte Compléments d algorithmique 12
Primitives de gestion Lecture 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). Lecture d un caractère 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) x est une variable de type integer. Syntaxe : read(f,x); 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. Syntaxe : read(f,x); Après l exécution de la primitive, la tête de lecture est positionnée juste après l entier. Fichier texte Compléments d algorithmique 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; assign(f, fichier.txt ); reset(f); read(f, e); writeln(e); read(f, e); writeln(e); read(f, e); writeln(e); end. Fichier texte Compléments d algorithmique 14
Primitives de gestion Syntaxe : read(f,x); x est une variable de type string Lecture d une chaîne 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 Syntaxe : readln(f); 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 Équivalent à read(f,x); readln(f); Syntaxe : readln(f,x); Read,readln: nbre variable de paramètres. Ex : read(f,v1,v2); Fichier texte Compléments d algorithmique 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 Exemple (etudl1.txt) : Dupont Alexis Qwerty Bob Fichier texte Compléments d algorithmique 16
Primitives de gestion : exemple Exemple : program fich_etud; var entree, sortie: TEXT; nom, formation: string; annee: integer; assign(entree, etud.txt ); reset(entree); assign(sortie, etudl1.txt ); rewrite(sortie); while not(eof(entree)) do readln(entree, nom); readln(entree, formation); readln(entree, annee); if formation = L1 then writeln(sortie, nom); end; close(sortie); close(entree); end. Fichier texte Compléments d algorithmique 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) Ex: Un fichier contenant des enregistrements, pour stocker des informations sur les étudiants : Fichier dont les éléments sont des enregistrements de type Etudiant Un fichier structuré est terminé par une marque de fin de fichier eof. type Etudiant = record nom : string[20]; formation : string[20]; annee : integer; end; ne peut pas être édité avec un éditeur ou traitement de texte. Fichier structuré Compléments d algorithmique 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; Fichier structuré Compléments d algorithmique 19
Fichiers structurés : primitives de gestion Association : 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 Exactement comme sur un fichier texte, mais permet lecture ET écriture. Ouverture en exploitation Syntaxe : assign(f,nomf); Syntaxe : rewrite(f); Syntaxe : reset(f); 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é. Fichier structuré Compléments d algorithmique 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 Fermeture du fichier Syntaxe : eof(f); Exactement comme sur un fichier texte Syntaxe : close(f); Fichier structuré Compléments d algorithmique 21
Écriture Fichiers structurés : primitives de gestion 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 : Syntaxe : write(f,expr); 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 Fichier structuré Compléments d algorithmique 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. Fichier structuré Compléments d algorithmique 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 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 : filesize(f); Syntaxe : filepos(f); 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 Fichier structuré Compléments d algorithmique 24
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. Fichier structuré Compléments d algorithmique 25
Exemple : types Exemple : program baseetud; type Etudiant = record ine : integer; nom : string[20]; formation : string[20]; end; type FichierEtudiant = file of Etudiant; Fichier structuré Compléments d algorithmique 26
Exemple : Saisie et sauvegarde Exemple : procedure saisie(var e: Etudiant); 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); seek(f, filesize(f)); write(f, e); end; Fichier structuré Compléments d algorithmique 27
Exemple : Affichage Exemple : /* Affiche a l ecran le contenu du fichier f */ procedure afficher(var f: FichierEtudiant); var e: Etudiant; seek(f, 0); while not(eof(f)) do read(f, e); writeln(e.ine,, e.nom,, e.formation); end; end; Fichier structuré Compléments d algorithmique 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; trouve := false; seek(f, 0); while not(trouve) and not(eof(f)) do read(f, e); if e.ine = ine then trouve := true; end; if trouve then seek(f, filepos(f)-1); end; Fichier structuré Compléments d algorithmique 29
Exemple: Recherche d un étudiant function appartient(var f: FichierEtudiant; ine: integer): boolean; 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); 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. Fichier structuré Compléments d algorithmique 30
Exemple : Trier les étudiants procedure trier(var f: FichierEtudiant); var i, j, taille, indicemin, inemin : integer; etudianti, etudiantj : Etudiant; taille := filesize(f); for i := 0 to taille-1 do seek(f, i); read(f, etudianti); indicemin := i; inemin := etudianti.ine; for j := i+1 to taille-1 do read(f, etudiantj); if etudiantj.ine < inemin then inemin := etudiantj.ine; indicemin := j; end; end; if indicemin <> i then echanger(f, i, indicemin); end; end; Fichier structuré Compléments d algorithmique 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; 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; Fichier structuré Compléments d algorithmique 32
Exemple : programme principal var f: FichierEtudiant; et: Etudiant; 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. Fichier structuré Compléments d algorithmique 33