Serie 16 niveau 0 Fichier : automate de lecture, lecture/écriture de fichiers



Documents pareils
1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Le prototype de la fonction main()

Programmation système I Les entrées/sorties

Introduction au langage C

Programmation en langage C

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

COMPARAISONDESLANGAGESC, C++, JAVA ET

Programmation impérative

Programmation système de commandes en C

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Les fichiers. Chapitre 4

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Compression de Données - Algorithme de Huffman Document de Conception

Bases de programmation. Cours 5. Structurer les données

Java Licence Professionnelle CISII,

Initiation. àl algorithmique et à la programmation. en C

Programmation système en C/C++

Programmation en langage C Eléments de syntaxe

Algorithmique et Programmation, IMA

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

SUPPORT DE COURS. Langage C


Programme Compte bancaire (code)

Le système de gestion des fichiers, les entrées/sorties.

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

OS Réseaux et Programmation Système - C5

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

3IS - Système d'exploitation linux - Programmation système

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cours 6 : Tubes anonymes et nommés

Les chaînes de caractères

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

TP2 : tableaux dynamiques et listes chaînées

Programmation Classique en langage C

Cours Programmation Système

Plan du cours. Historique du langage Nouveautés de Java 7

Cours d initiation à la programmation en C++ Johann Cuenin

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Cours de programmation avancée. Le langage C. Université du Luxembourg

INITIATION A LA PROGRAMMATION

Cours de Système : Gestion de Fichiers

Le langage C. Séance n 4

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

INF 104 (SELC) Introduction au langage C

Les structures de données. Rajae El Ouazzani

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Conventions d écriture et outils de mise au point

TD3: tableaux avancées, première classe et chaînes

Programmation C. J.-F. Lalande. 15 novembre 2012

Chap III : Les tableaux

COURS DE LANGAGE C. DIAO Oumar. Université de Rennes 1. Master 1

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Premiers Pas en Programmation Objet : les Classes et les Objets

Rappels Entrées -Sorties

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

as Architecture des Systèmes d Information

Architecture des ordinateurs

Chapitre 1 : La gestion dynamique de la mémoire

Projet de programmation (IK3) : TP n 1 Correction

Programmation Réseau SSH et TLS (aka SSL)

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

I. Introduction aux fonctions : les fonctions standards

Pensez à vous inscrire... si ce n est pas encore fait

Table des matières. Chapitre 4 : Variables pointeurs

Derrière toi Une machine virtuelle!

Lier Erlang avec d autres langages de programmation

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Corrigé des exercices sur les références

Les processus. Système L3, /39

INFO-F-105 Language de programmation I Séance VI

Programmation Structurée Langage C

INFO-F-404 : Techniques avancées de systèmes d exploitation

Claude Delannoy. 3 e édition C++

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Langage Éric Guérin 5 octobre 2010

Les arbres binaires de recherche

Programmer en JAVA. par Tama

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

PROGRAMMATION PAR OBJETS

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

Cours de C. Allocation dynamique. Sébastien Paumier

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Notions fondamentales du langage C# Version 1.0

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Programmation C. Apprendre à développer des programmes simples dans le langage C

Programmation en C/C++

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation client-serveur sockets - RPC

Travaux Dirigés n 1 : chaînes de caractères

Transcription:

Serie 16 niveau 0 Fichier : automate de lecture, lecture/écriture de fichiers Exemple du cours : automate de lecture d un fichier de configuration On veut écrire un petit programme qui lit un fichier répondant au format indiqué pour un fichier de configuration structuré comme suit : - les lignes vides ou commençant par # (commentaire) sont ignorées - le fichier comporte 3 sections sur le même modèle : - tout d abord un nombre entier positif indique un certain nombre d entités N - puis une liste des entités est fournie, avec une entité par ligne, si N >0 - chaque entité peut avoir un format de lecture différent Pour les livreurs, on lit un nom suivi d un entier pour un booléen Pour les véhicules, on lit un entier d identification suivi d un entier pour un booléen Pour les livraisons, on lit un nom de livreur suivi d un entier identifiant un véhicule L automate de lecture prévoit tous les cas possibles de lecture selon les nombres d entités : on appelle ces cas des «états» de lecture. Le cours montre les conditions à remplir pour passer d un état à un autre ; la représentation sous forme d un graphe est très utile pour mettre au point le programme. Le programme est organisé à l aide de 4 fonctions : - main récupère un nom de fichier sur la ligne de commande - lecture ouvre le fichier et le lit ligne par ligne et éliminant les lignes inutiles - decodage_ligne est le véritable automate de lecture. Il décode la ligne courante qui lui envoyée par lecture(). on remarque quelques variables static qui mémorisent leur valeur d un appel au suivant. - une fonction erreur centralise le traitement des erreurs avec l affichage d un message puis l arrêt du programme. Pour cette fonction on a créé une liste de symboles à l aide du mot clef enum : // symboles et type pour codes d'erreurs enum Erreur_lecture LECTURE_ARG, LECTURE_OUVERTURE, LECTURE_NB0, LECTURE_LIVREUR, LECTURE_NB1, LECTURE_VEHICULE, LECTURE_NB2, LECTURE_LIVRAISON, LECTURE_FIN, LECTURE_ETAT; Ensuite on a créé un nouveau type ERREUR_LECTURE avec le mot clef typedef : typedef enum Erreur_lecture ERREUR_LECTURE; Voici les prototypes des 3 fonctions en plus de main. le nouveau type est utilisé pour le paramètre de la fonction erreur.

void lecture(char * nom_fichier); void decodage_ligne(char * tab); void erreur(erreur_lecture code); La fonction main délègue le travail principal à la fonction lecture // lit le fichier dont le nom est transmis sur la ligne de commande int main(int argc, char * argv[]) if(argc!= 2) erreur(lecture_arg); lecture(argv[1]); La fonction lecture se charge d ouvrir le fichier et de filtrer les lignes inutiles (vides, commentaires). une ligne utile est transmise à la fonction décodage_ligne qui réalise l automate de lecture. // traite le fichier ligne par ligne. void lecture( char * nom_fichier) char tab[80]; FILE * fichier = NULL; if((fichier = fopen (nom_fichier, "r"))!= NULL) while(fgets(tab,80,fichier)) if((tab[0]=='#') (tab[0]=='\n') (tab[0]=='\r')) continue; // lignes à ignorer, on passe à la suivante decodage_ligne(tab); printf("fin de la lecture\n"); else erreur(lecture_ouverture); La fonction décodage_ligne réalise l automate de lecture qui vérifie la validité du format et décode la ligne tab envoyée en paramètre selon l état courant mémorisé dans la variable static etat.cette variable est initialisée une seule fois au lancement du programme avec l état initial NB0 ; on remarquera que NB0 provient d une autre liste de symboles aussi créée avec le mot clef enum. cette manière de créer des symboles est beaucoup plus compacte qu une longue liste de directives define. la variable compteur i et le total sont aussi en static pour les mémoriser d un appel au suivant. // décodage selon l'etat courant d'une ligne lue dans le fichier // met à jour l'etat void decodage_ligne(char * tab) // états de l'automate de lecture

enum Etat_lecture NB0,LIVREUR,NB1,VEHICULE,NB2,LIVRAISON,FIN; static int etat = NB0; // état initial static int i, total; int disp, num; char nom[40]; le cœur de l automate est une instruction switch sur la valeur de la variable etat. Pour chaque état prévu la ligne va être décodée puis analysée de manière distincte. A cette occasion on teste si la lecture se passe bien en vérifiant que la valeur renvoyée par sscanf est bien le nombre de code de format prévu. Par exemple sscanf doit renvoyer 1 lorsqu on est dans l état NB0. La fonction erreur est appelée en cas d erreur. Une conséquence de l analyse de la ligne est la possibilité d un changement de l état. Par exemple si on se trouve dans l état initial NB0 et que la variable total lit une valeur nulle alors on passe dans l état NB1 sinon on passe dans l état LIVREUR. L appel suivant de cette fonction en tiendra compte grâce à la mémorisation de type static de la variable etat. L autre conséquence de la lecture est une action d affichage avec printf. Bien sûr dans le cas d un projet on ajouterait d autres actions comme la construction d une structure de données. switch(etat) case NB0: if(sscanf(tab,"%d", &total)!=1) erreur(lecture_nb0); else i=0 ; if(total==0) etat=nb1; else etat=livreur ; printf("nb de livreurs: %d\n",total); break; case LIVREUR: if(sscanf(tab,"%39s %d", nom, &disp)!= 2) erreur(lecture_livreur); else ++i; if(i == total) etat=nb1 ; printf("livreur %d: %s \t %d\n",i, nom, disp); break; case NB1: if(sscanf(tab,"%d", &total)!=1) erreur(lecture_nb1); else i=0 ; if(total==0) etat=nb2; else etat=vehicule ; printf("nb de véhicules: %d\n",total); break; case VEHICULE: if(sscanf(tab,"%d %d", &num, &disp)!= 2) erreur(lecture_vehicule); else ++i; if(i == total) etat=nb2 ; printf("vehicule %d: %d \t %d\n",i, num, disp); break; case NB2: if(sscanf(tab,"%d", &total)!=1) erreur(lecture_nb2); else i=0;

if(total==0) etat=fin; else etat=livraison ; printf("nb de livraisons: %d\n",total); break; case LIVRAISON: if(sscanf(tab,"%39s %d", nom, &num)!= 2) erreur(lecture_livraison); else ++i; if(i == total) etat=fin ; printf("livraison %d: %s \t %d\n",i, nom, num); break; case FIN: erreur(lecture_fin) ; break; default: erreur(lecture_etat); La dernière fonction rassemble tous les cas d erreurs considérés dans ce programme. On retrouve les symboles définis avec enum en début de fichier. On pourrait préciser les messages pour les symboles LECTURE_NB0 jusqu à LECTURE_LIVRAISON pour fournir une information plus précise à l usager. // affiche un message d'erreur puis quitte le programme void erreur(erreur_lecture code) switch(code) case LECTURE_ARG : printf(" nom de fichier manquant\n"); break; case LECTURE_OUVERTURE: printf(" ouverture impossible\n");break; case LECTURE_NB0 : case LECTURE_NB1 : case LECTURE_NB2 : case LECTURE_LIVREUR : case LECTURE_VEHICULE : case LECTURE_LIVRAISON : printf(" lecture impossible \n"); case LECTURE_FIN : printf(" format non respecté \n"); break; case LECTURE_ETAT : printf(" etat inexistant\n"); break; default: printf(" erreur inconnue\n"); exit(exit_failure); Le code complet se trouve dans le répertoire serie16_0 sous le nom automate_lecture_fichier.c avec un fichier de configuration config1.txt que vous pouvez modifier pour tester le bon fonctionnement du programme. Exercice 2 (niveau 0): Lire et afficher le contenu d'un fichier texte On veut écrire un programme afficher.c qui permet de lire et d'afficher le contenu d'un fichier texte avec le nom texte.txt qui se trouve dans le même répertoire que le fichier de source afficher.c Cet exercice reprend pas à pas les différentes étapes pour y parvenir 1. Ouvrez le fichier (vide) afficher.c dans votre éditeur pour y parvenir.

2. Préparez le "coquille vide" de base accueillant votre programme. Pour utiliser des fichier, il faut inclure le fichier de définition stdio.h int main() 3. On va utiliser la fonction fgetc() pour lire le fichier et renvoyer l'entier lu. Cette fonction renvoie la valeur EOF quand on arrive à la fin du fichier. On va se servir de cette particularité pour arrêter la lecture à la fin du fichier. Cette fonction a besoin d'une variable pointeur de type FILE. int main() char octet; FILE *fichier; fichier = fopen("texte.txt", "rt"); if (fichier == NULL) printf("le fichier texte est absent\n"); return EXIT_FAILURE; while((octet=fgetc(fichier))!= EOF) printf("%c", octet); fclose(fichier); printf("\nfin du fichier texte\n"); Exercice 3 (niveau 0): Copier un fichier en utilisant le mode binaire On veut écrire un programme copier.c qui permet de copier le contenu d'un fichier. Cet exercice reprend pas à pas les différentes étapes pour y parvenir 1. Ouvrez le fichier (vide) copier.c dans votre éditeur favori 2. Préparez la "coquille vide" de base accueillant votre programme. Pour utiliser des fichier, il faut inclure le fichier de définition stdio.h.

int main() 3. Pour arriver à nos fins, il va nous falloir ouvrir 2 fichiers, il nous faut donc 2 variables pointeur de type FILE. Le paramètre "b" de la commande fopen() vous permet d'ouvrir un fichier en mode binaire. Par défaut (sans utilisant le paramètre "b"), les fichiers sont ouverts en mode texte. On utilisera fichier_initial (nom du fichier: texte.txt) et fichier_copie (nom du fichier: texte2.txt) pour la compréhension. On utilisera la fonction fputc() pour copier caractère par caractère d'un fichier à l'autre. int main() char octet; FILE *fichier_initial; FILE *fichier_copie; fichier_initial = fopen("texte.txt", "rb"); if (fichier_initial == NULL) printf("le fichier texte est absent\n"); return EXIT_FAILURE; fichier_copie = fopen("texte2.txt", "wb"); if (fichier_copie == NULL) printf("erreur dans la creation du fichier \n"); return EXIT_FAILURE; printf("debut de la copie\n"); while((octet = fgetc(fichier_initial))!= EOF) fputc(octet, fichier_copie); fclose(fichier_copie); fclose(fichier_initial); printf("fin de l'operation\n");