Le fichier séquentiel [fs] Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner Unisciel algoprog Version 17 avril 2015 Table des matières 1 Présentation 2 2 Exploitation d un document 3 3 Primitives 5 3.1 Déclaration de fichier............................. 5 3.2 Ouverture d un canal d entrée/sortie.................... 5 3.3 Fermeture d un canal d entrées/sorties................... 6 3.4 Lecture depuis un canal d entrée....................... 6 3.5 Écriture sur un canal de sortie........................ 6 3.6 Détection de fin de contenu......................... 7 4 Exemples d utilisation 8 4.1 Algorithme de base.............................. 8 4.2 Exemple : Copie d un fichier......................... 8 4.3 Le cas des fichiers vides............................ 9 4.4 Exemple : Calcul de la moyenne....................... 10 5 Exercice résolu : Fichier clients séquentiel 11 5.1 Création d un fichier clients......................... 11 5.2 Affichage du fichier clients.......................... 11 6 Compléments 11 Introduction Mots-Clés Algorithmique, Programmation, C++, Fichier séquentiel. Requis Structuration de l information. Toutes les informations que nous avons traitées jusqu à présent ont été placées dans une mémoire dite volatile à l aide de variables que nous avons au préalable déclarées. Cela signifie que, dès que l algorithme ou le programme se termine, les variables disparaissent 1
Unisciel algoprog fs00acours-texte, April 17, 2015 2 de la mémoire. Par voie de conséquence les données stockées disparaissent également. S il faut pourvoir les stocker dans une mémoire permanente c est là qu intervient la notion de fichier. Ce module présente le fichier séquentiel, décrit les primitives des fichiers séquentiels, donne des exemples d utilisation et analyse le cas des fichiers vides.
Unisciel algoprog fs00acours-texte, April 17, 2015 3 1 Présentation Fichier informatique Est une unité informationnelle physiquement stockée sur un support de mémoire de masse permanent (disque dur, CD-ROM, clé USB par exemple). Fichier séquentiel Le qualificatif séquentiel (il existe également des fichiers à accès direct ; cf. @[Les fichiers]) signifie que lorsqu on lit un fichier, pour accéder à un élément de position donnée, il faut d abord avoir lu tous les éléments précédents. De même, lorsqu on écrit dans un fichier séquentiel, les éléments sont ordonnés dans l ordre dans lequel ils sont écrits : une prochaine lecture les donnerait dans ce même ordre. Lecture ou Écriture Nous allons considérer qu un fichier peut être lu ou écrit mais pas les deux en même temps (Certains systèmes et langages mettent à disposition des fichiers en lecture/écriture simultanées). On considère aussi qu un fichier doit explicitement être ouvert avant toute lecture/écriture et qu il doit être fermé après la dernière lecture/écriture. Élément courant Lors d une lecture de fichier, on appelle «élément courant», le prochain élément qui sera lu. L ensemble étant fini, il doit être possible d en détecter la fin : on peut imaginer la présence d une marque particulière caractérisant cette fin (marque de fin de fichier). Nous utilisons la convention qu une lecture infructueuse est nécessaire pour détecter la fin d un fichier. (Il existe une autre convention de lecture que l on rencontre dans certains langages et qui stipule qu on peut détecter la fin de fichier juste après la dernière lecture utile.) Le fichier n est pas la seule structure qui peut être accédée en séquence. On peut faire de même pour un tableau, une liste ou encore d autres structures.
Unisciel algoprog fs00acours-texte, April 17, 2015 4 2 Exploitation d un document Un algorithme qui lit des données ou écrit des résultats dans un fichier accomplit une opération d entrée/sortie. Un tel transfert d information est effectué via un canal d entrées/sorties. L information traitée via un canal d entrées/sorties est présentée sous forme textuelle (c.-à-d. une séquence de caractères) dans le document visé. On considère un canal d entrées/sorties comme une séquence de caractères et les références à un canal d entrées/sorties se font via un nom de canal. Fichier en lecture La logique pour accéder à un fichier en lecture (fichier existant, non modifié par l algorithme) est toujours la même : Une ouverture (voir Ouvrir) Des lectures (voir Prendre et FinDeFichier) Une fermeture (voir Fermer) Fichier en écriture L accès à un fichier en écriture (fichier créé par l algorithme) répond à la logique : Une ouverture (voir Ouvrir) Des écritures (voir Mettre) Une fermeture (voir Fermer) Remarque : Ouvrir Le système peut être dans l impossibilité d ouvrir le fichier spécifié pour une ou l autre des raisons suivantes : L algorithme tente d ouvrir un fichier inexistant en mode lecture. L algorithme tente d ouvrir un fichier qui est déjà ouvert. L algorithme tente d ouvrir un fichier sur un canal d entrées/sorties invalide. Le nom du fichier est invalide : ceci peut être dû au dossier inexistant, au nom du fichier contenant des caractères interdits par le système d exploitation ou à l unité de stockage défectueuse ou non disponible. Modes d ouverture Trois modes sont supportés : Lecture : Permet de lire le contenu du document. Si le document est inexistant, l exécution de l algorithme est interrompue. Écriture : Permet d écrire des résultats dans le document. Le contenu antérieur à l ouverture du document est «détruit». Si le document est un fichier inexistant, celui-ci est créé. Ajout : Permet d écrire des résultats à la fin du document. Le contenu antérieur à l ouverture du document est conservé. Si le document est un fichier inexistant, celui-ci est créé. Seule l instruction de lecture (Prendre) est autorisée sur un canal d entrées/sorties associé à un document ouvert en mode Lecture. Similairement, seule l instruction d écriture (Mettre) est autorisée sur un canal d entrées/sorties associé à un document ouvert en
Unisciel algoprog fs00acours-texte, April 17, 2015 5 mode Écriture ou Ajout. Toute instruction de lecture ou d écriture invalide sur un canal d entrées/sorties provoque l arrêt de l exécution de l algorithme avec affichage d un message d erreur.
Unisciel algoprog fs00acours-texte, April 17, 2015 6 3 Primitives 3.1 Déclaration de fichier alg : Déclaration de fichier Variable varfich : Fichier C++ : Déclaration de fichier #include <fstream> ifstream is ; // fichier en lecture (Input) ofstream os ; // fichier en écriture (Ouput) Explication Déclare une variable varfich de type Fichier. 3.2 Ouverture d un canal d entrée/sortie alg : Ouverture d un canal Ouvrir ( varfichier, nomfichier, utilisation ) C++ : Ouverture d un canal #include <fstream> ifstream variablefichier ( nomfichier ) ; // fichier en Lecture ofstream variablefichier ( nomfichier ) ; // fichier en Ecriture Explication Associe un canal d entrées/sorties à un fichier et indique le mode d accès (l Utilisation) du canal d entrée/sortie : Lecture, Ecriture ou Ajout. La varfichier sera utilisée pour toutes les opérations sur ce fichier jusqu à sa fermeture. Si aucun chemin de dossiers n est spécifié avec le nom du fichier, le système ouvre le fichier dans le dossier courant (habituellement le dossier où est sauvegardé le projet en exécution). Lorsqu il y a erreur à l ouverture d un fichier, le système provoque l interruption du programme et affiche un message d erreur précisant la cause de l erreur. Cette primitive est nécessaire avant toute opération sur un fichier, existant ou non.
Unisciel algoprog fs00acours-texte, April 17, 2015 7 3.3 Fermeture d un canal d entrées/sorties alg : Fermeture d un canal Fermer ( variablefichier ) C++ : Fermeture d un canal variablefichier.close() ; Explication Ferme le canal d entrées/sorties associé au document. Dans le cas où le fichier a été ouvert en écriture, cette primitive place la marque spéciale de fin de fichier dans l élément courant. Une fois le fichier fermé, il n est plus permis de l utiliser. Un fichier créé et non refermé risque de contenir des données aléatoires et invalides. 3.4 Lecture depuis un canal d entrée alg : Lecture depuis un canal d entrée Prendre ( variablefichier, nomvar1, nomvar2... ) C++ : Lecture depuis un canal d entrée variablefichier >> nomvar1 >> nomvar2... ; Explication Lit dans le fichier référencé par la variablefichier, ouvert en lecture, des valeurs qui seront affectées aux variables nomvari. Cette opération peut échouer si la fin de fichier est atteinte. Ceci est décelable grâce à la fonction FinDeFichier. Le canal d entrées/sorties doit obligatoirement être associé à un document ouvert en mode Lecture. Toute tentative de lecture visant un canal d entrées/sorties associé à un document ouvert en mode Ecriture ou Ajout cause l arrêt d exécution de l algorithme. 3.5 Écriture sur un canal de sortie alg : Écriture sur un canal de sortie Mettre ( variablefichier, expr1, expr2...)
Unisciel algoprog fs00acours-texte, April 17, 2015 8 C++ : Écriture sur un canal de sortie variablefichier << expr1 << expr2... ; Explication Rajoute des données dans le fichier référencé par la variablefichier, ouvert en écriture, les valeurs des expressions expri. Cette opération peut échouer si le support utilisé pour le fichier est plein. Le canal d entrées/sorties doit obligatoirement être associé à un document ouvert en mode Ecriture ou Ajout. Toute tentative d écriture visant un canal d entrées/sorties associé à un document ouvert en mode Lecture provoque l arrêt d exécution de l algorithme. 3.6 Détection de fin de contenu alg : Détection de fin de contenu FinDeFichier ( variablefichier ) C++ : Détection de fin de contenu variablefichier.eof() «eof» signifie «EndOfFile». Explication Renvoie la valeur Vrai si la fin de fichier a été détectée, Faux sinon. Dans certains langages, il s agira d une variable en lecture seule ; dans d autres langages, ce sera un appel de module ou de méthode. La primitive n est applicable qu aux canaux d entrées/sorties associés en mode Lecture. Toute invocation de la primitive sur un canal d entrées/sorties associé à un document ouvert en mode Ecriture ou Ajout cause l arrêt d exécution de l algorithme.
Unisciel algoprog fs00acours-texte, April 17, 2015 9 4 Exemples d utilisation 4.1 Algorithme de base L algorithme type dont la structure se retrouve dans la majorité des algorithmes exploitant un fichier est le suivant : Algorithme Action parcoursfichier ( nomfichier : Cha^ıne ) Variable is : Fichier Variable enregistrement : T Début Ouvrir ( is, nomfichier, Lecture ) Prendre ( is, enregistrement ) TantQue Non FinDeFichier ( is ) traiter ( enregistrement ) Prendre ( is, enregistrement ) FinTantQue Fermer ( is ) Fin Programme A FINIR 4.2 Exemple : Copie d un fichier Voici un algorithme qui recopie les données d un fichier (en lecture) dans un autre (en écriture). Algorithme Action parcoursfichier ( nomfichier : Cha^ıne ) Variable is : Fichier Variable enregistrement : T Début Ouvrir ( is, nomfichier, Lecture ) Prendre ( is, enregistrement ) TantQue Non FinDeFichier ( is ) traiter ( enregistrement ) Prendre ( is, enregistrement ) FinTantQue Fermer ( is ) Fin
Unisciel algoprog fs00acours-texte, April 17, 2015 10 Programme A FINIR 4.3 Le cas des fichiers vides Dans tout algorithme de manipulation de fichiers, il faut se demander ce qu il advient du cas d un fichier vide (rappelons que c est la première lecture qui permet d identifier ce cas). Il y a trois cas de figure : 1. C est un cas particulier qui est traité correctement par l algorithme général. 2. Il demande un traitement spécial qui n est pas couvert par le cas général. 3. Il dénote un problème mal posé qui ne peut être résolu. Exemple Si le problème est de calculer la somme, la moyenne ou encore le maximum de nombres contenus dans un fichier, alors la solution ne peut être donnée dans le cas d un fichier vide (cas 3) à moins que l analyse n ait clairement indiqué la réponse à donner dans ce cas (cas 2). Il faut donc traiter le cas particulier de fichier vide juste après la première lecture. Réécrivons alors l algorithme général de traitement d un fichier séquentiel. Algorithme général Action traiterfichier ( nomfichier : Cha^ıne ) Variable is : Fichier Variable enregistrement : T Début Ouvrir ( is, nomfichier, Lecture ) Prendre ( is, enregistrement ) Si FinDeFichier ( is ) Alors traitementspecialfichiervide ( ) Sinon TantQue Non FinDeFichier ( is ) traiter ( enregistrement ) Prendre ( is, enregistrement ) FinTantQue FinSi Fermer ( is ) Fin
Unisciel algoprog fs00acours-texte, April 17, 2015 11 Programme général A FINIR Lorsque le «traitement spécial du fichier vide» consiste à générer une «ERREUR» alors le Si peut être changé en un Si-Alors suivi du traitement normal. 4.4 Exemple : Calcul de la moyenne La fonction calcule et renvoie la moyenne d une série de réels contenus dans un fichier. Fonction calculmoyenne Fonction calculmoyenne ( nomfichier : Cha^ıne ) : Réel Variable somme, nombre : Réel Variable cpt : Entier Variable is : Fichier Début Ouvrir ( is, nomfichier, Lecture ) cpt <- 0 somme <- 0 Prendre ( is, nombre ) Si FinDeFichier ( is ) Alors Fermer ( is ) erreur ( "Fichier vide" ) Sinon TantQue Non FinDeFichier ( is ) cpt <- cpt + 1 somme <- somme + nombre Prendre ( is, nombre ) FinTantQue FinSi Fermer ( is ) Retourner ( somme / cpt ) Fin @[fsmoyennea1.alg] Fonction calculmoyenne A FINIR @[fsmoyennea1.cpp]
Unisciel algoprog fs00acours-texte, April 17, 2015 12 5 Exercice résolu : Fichier clients séquentiel 5.1 Création d un fichier clients 5.2 Affichage du fichier clients 6 Compléments