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



Documents pareils
Programmation impérative

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

Les fichiers. Chapitre 4

Programmation système I Les entrées/sorties

GESTION DES FICHIERS C/UNIX

Cours de Système : Gestion de Fichiers

Cours 14 Les fichiers

Programmation en langage C Eléments de syntaxe

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

Cours 6 : Tubes anonymes et nommés

Programmation système de commandes en C

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

SYSTÈME DE GESTION DE FICHIERS

Gestion des fichiers. Telecom-ParisTech BCI Informatique

Le langage C. Séance n 4

Les chaînes de caractères

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

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

Programmation système en C/C++

Les structures. Chapitre 3

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

SUPPORT DE COURS. Langage C

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

Rappels Entrées -Sorties

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

Programmation en langage C

Algorithmique et Programmation, IMA

Introduction au langage C

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

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

Stockage du fichier dans une table mysql:

Notes sur le Langage C

Flux de données Lecture/Ecriture Fichiers

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

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

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

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

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Cours Programmation Système

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Programmation Structurée Langage C

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

CARPE. Documentation Informatique S E T R A. Version Août CARPE (Documentation Informatique) 1

Analyse de sécurité de logiciels système par typage statique

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

1 Lecture de fichiers

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

Chapitre 1 : La gestion dynamique de la mémoire

Conventions d écriture et outils de mise au point

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

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

Cours de Systèmes d Exploitation

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

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)

TP : Gestion d une image au format PGM

Système clients serveur Kwartz Vulgarisation, identification, dossier personnel

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

Manuel d'installation

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

COMPARAISONDESLANGAGESC, C++, JAVA ET

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

Télécom Nancy Année

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

Système de Gestion de Fichiers

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

Ressources pour débutant du logiciel SMART Notebook

Ressources pour débutant du logiciel SMART Notebook

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

BTS 2 SIO Active directory- windows serveur 2012 Version 1.1 (12/12/2014)

ACTIVITÉ DE PROGRAMMATION

Les structures de données. Rajae El Ouazzani

Concept de machine virtuelle

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

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

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

Structure fonctionnelle d un SGBD

Initiation à la programmation en Python

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

Onglet sécurité de Windows XP Pro et XP Home

Les débordements de tampons et les vulnérabilités de chaîne de format 1

UE Programmation Impérative Licence 2ème Année

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

TP3 : Manipulation et implantation de systèmes de fichiers 1

INITIATION A LA PROGRAMMATION

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

I. Introduction aux fonctions : les fonctions standards

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Manuel d'utilisation d'apimail V3

Le prototype de la fonction main()

IV- Comment fonctionne un ordinateur?

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Le protocole ARP (Address Resolution Protocol) Résolution d adresses et autoconfiguration. Les protocoles ARP, RARP, TFTP, BOOTP, DHCP

Temps Réel. Jérôme Pouiller Septembre 2011

1 Mesure de la performance d un système temps réel : la gigue

Comment utiliser le lecteur MP3?

Cours: Administration d'une Base de Données

Langage Java. Classe de première SI

Le transfert de fichiers avec Filezilla Initiation à l'utilisation d'un client FTP

Structure d un programme

Transcription:

I Présentation : Dans le chapitre 1, nous avons vu comment utiliser les appels-systèmes de bas niveau pour créer et accéder à des fichiers sur le disque. Nous avons notamment mis en évidence leur dépouillement et le nécessité de gérer des tampons mémoire pour améliorer leurs performances. Avec la librairie standard d'e/s, nous disposons de fonctions de haut-niveau, respectant la norme ISO C, donc portables sur d'autres systèmes respectant cette norme. De plus, elles gèrent de manière transparente les outils d'amélioration de l'efficacité des E/S (buffers de taille optimale, etc ). Néanmoins, elles introduisent d'autres problèmes que nous verrons aussi dans ce chapitre. II Pointeurs de flux : Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers. Avec la librairie standard, lors de l'ouverture ou de la création d'un fichier, nous lui associerons un flux de données, et y accèderons via un pointeur de flux de type FILE *. Le type FILE est une structure comprenant plusieurs champs : on y trouve notamment le descripteur du fichier ainsi que les adresses et tailles du buffer utilisé, entre autres. Au final, comme on le voit avec la présence du descripteur de fichier dans cette structure, les fonctions de la librairie standard vont utiliser les appels-système du SGF car ce sont les seuls moyens d'accéder aux fichiers. Elles vont simplement ajouter une couche de gestion des buffers, entre autres fonctionnalités, et permettre ainsi de minimiser le nombre d'appels-système. Les trois canaux de communication ouverts lors de la création d'un processus possèdent aussi un pointeur de flux de type FILE *: - stdin pour l'entrée standard. - stdout pour la sortie standard. - stderr pour la sortie d'erreur standard. 1

III Ouverture d'un flux : Nom de la fonction : fopen FILE *fopen(char *pathfile, char*type); Si succès, retourne un pointeur de flux, NULL sinon. pathfile : nom et éventuellement chemin du fichier à ouvrir/créer. type : mode d'ouverture du fichier : - "r " : ouverture en lecture seule. - "w" : ouverture en écriture seule avec écrasement préalable du fichier s'il existe déjà. - "a" : ouverture en écriture seule en mode ajout en fin de fichier. - "r+" : ouverture en lecture et écriture, positionnement en début de fichier. - "w+": ouverture en lecture et écriture, avec écrasement préalable du fichier s'il existe déjà. - "a+" : ouverture en lecture et écriture en mode ajout en fin de fichier. Les systèmes de type Windows demandent de préciser si le fichier à ouvrir/créer sera un fichier binaire ou non, il faut donc ajouter un b aux modes d'ouverture ("rb", "wb", "ab", "rb+", "wb+", "ab+"). Linux ne différenciant pas les fichiers binaires des autres, ce "b" n'est pas nécessaire et sera ignoré s'il est précisé. Récapitulatif des modes d'ouvertures et de leurs contraintes : Contraintes "r" "w" "a" "r+" "w+" "a+" Le fichier doit exister x x Le fichier est vidé s'il existe déjà x x Le flux peut être lu x x x x Le flux peut être écrit x x x x x Le flux ne sera écrit qu'en fin de fichier x x 2

Exemples : FILE *fp; fp=fopen("/home/esgi/données","w+"); if (fp==null) printf("erreur d'ouverture\n"); exit(-1); Le fichier "/home/esgi/données" sera écrasé s'il existe, créé sinon, et ouvert en lecture et écriture. FILE *filep; filep=fopen("data","r"); if (filep==null) printf("erreur d'ouverture\n"); exit(-1); Le fichier "data" du repertoire courant sera ouvert en lecture seule. S'il n'existe pas, il y aura une erreur d'ouverture. 3

IV Lecture et écriture non formatées : Il existe 3 types d'e/s non formatées : - par caractère : on lit et/ou écrit un caractère à la fois. - par ligne : on lit et/ou écrit une ligne à la fois. - binaires : on lit et/ou écrit des objets binaires. 1 E/S par caractère : a Ecriture : Nom de la fonction : fputc int fputc(int c, FILE *fp); Si succès, retourne le caractère c, EOF sinon (EOF est un caractère spécial signifiant End Of File). c : caractère à écrire. fp : pointeur de flux du fichier où écrire le caractère. b Lecture : Nom de la fonction : fgetc int fgetc(file *fp); Si succès, retourne le caractère lu, EOF sinon (erreur ou fin de fichier). fp : pointeur de flux du fichier où écrire le caractère. Exemple : FILE *fp; char c; fp=fopen("essai_fputc","w+"); printf("entrez un caractère :"); c=fgetc(stdin); // lit un caractère sur stdin (le clavier) fputc(c,fp); // écrit le caractère lu dans le fichier fp 4

2 E/S par ligne : a Ecriture : Nom de la fonction : fputs. int fputs(char *ch, FILE *fp); Si succès, retourne un entier non négatif, EOF sinon. ch : adresse de la chaîne de caractères à écrire. fp : pointeur de flux du fichier où écrire. Le caractère de fin de chaîne '\0' ne sera pas écrit dans le fichier. b Lecture : Nom de la fonction : fgets. int fgets(char *ch, int n, FILE *fp); Si succès, retourne l'adresse de la chaîne lue, EOF sinon. ch : adresse de la chaîne de caractères où sera stockée la ligne lue. n : nombre de caractères à lire au maximum. fp : pointeur de flux du fichier où lire. La lecture s'arrêtera au premier retour chariot rencontré ou si n caractères ont été lus. Le retour chariot sera inclus dans la chaîne lue. Un caractère de fin de chaîne sera ajouté à la chaîne lue. Exemple : FILE *fp; char chaine[20]; fp=fopen("essai_fputs","w+"); printf("entrez une chaîne :"); fgets(chaine,20,stdin); fputs(chaine,fp); // écrit la chaîne lue dans le fichier fp // lit une chaîne sur stdin d'au plus 20 caractère 5

3 E/S binaires : Elles permettent de lire ou d'écrire des structures complexes en une seule opération. Les données écrites le seront en binaire et ne seront, par conséquent, pas lisibles simplement (avec cat par exemple). a Ecriture : Nom de la fonction : fwrite. size_t fwrite(void *ptr, size_t sz, int nb, FILE *fp); Si succès, retourne le nombre d'objets écrits, une valeur inférieure au nombre d'objets à écrire sinon (on ne peut distinguer si c'est la fin du fichier qui a été étteinte ou s'il ya eu une erreur sans utiliser une autre fonction) ptr : adresse mémoire où est stocké le premier objet à écrire. sz : taille d'un objet. nb : nombre d'objets à écrire. fp : pointeur de flux du fichier où écrire. Exemple : struct client char nom[20]; int age; int solde; ; main() FILE *fp; struct client cl[3]; int i; size_t nblus; fp=fopen("essaibinaire","w+"); for (i=0;i<3;i++) printf("nom :"); scanf("%s",&cl[i].nom); printf("age :"); scanf("%d",&cl[i].age); printf("solde :"); scanf("%d",&cl[i].solde); nblus=fwrite(cl,sizeof(struct client),3,fp); if (nblus<3) printf("erreur ou fin de fichier atteinte\n"); 6

b Lecture : Nom de la fonction : fread. size_t fread(void *ptr, size_t sz, int nb, FILE *fp); Si succès, retourne le nombre d'objets lus, une valeur inférieure au nombre d'objets à lire sinon (on ne peut distinguer si c'est la fin du fichier qui a été étteinte ou s'il ya eu une erreur sans utiliser une autre fonction) ptr : adresse mémoire où sera stocké le premier objet à lire. sz : taille d'un objet. nb : nombre d'objets à lire. fp : pointeur de flux du fichier où lire. Exemple : struct client char nom[20]; int age; int solde; ; main() FILE *fp; struct client cl; int i; size_t nblus; fp=fopen("essaibinaire","r"); while ((nblus=fread(&cl,sizeof(struct client),1,fp))==1) printf("nom : %s\n",cl.nom); printf("age : %d\n",cl.age); printf("solde : %d\n",cl.solde); 7

3 Problèmes : Les E/S binaires posent un problème important : elles ne doivent être utilisées en lecture que sur le même système sur lequel les données ont été écrites. Ce qui limite beaucoup leur usage, empêchant de récupérer des données sur un réseau notamment. En effet, il y a 2 points qui posent problème : - Les décalages des membres dans les structures pour garantir un alignement mémoire optimal ne sont pas les mêmes selon les systèmes. - L'implémentation binaire des données multi-octets pour les entiers ou les flottants diffèrent selon les architectures machines. Ces différences peuvent entraîner une incohérence des données lues sur une machine qui n'utilise pas les mêmes décalages ou implémentations que celle sur laquelle les données ont été écrites. 8

V Lecture et écriture formatées : Ces fonctions permettent d'écrire ou de lire des fichiers contenant du texte. A la différence des E/S binaires, les fichiers écrits avec les E/S formatées seront lisibles très simplement (avec cat par exemple). On les utilise pour créer ou pour lire des fichiers de configuration par exemple. 1 Ecriture : Nom de la fonction : fprintf. int fprintf(file* fp, char *format, ); Si succès, retourne le nombre d'éléments écrits, -1 sinon. fp : pointeur de flux du fichier où écrire. format : chaîne de caractères à écrire, contenant éventuellement des variables (voir printf). Exemple : struct client char nom[20]; int age; int solde; ; main() FILE *fp; struct client cl; int i; size_t nblus; fp=fopen("essai_formate","w+"); for (i=0;i<3;i++) printf("nom :"); scanf("%s",&cl.nom); printf("age :"); scanf("%d",&cl.age); printf("solde :"); scanf("%d",&cl.solde); fprintf(fp,"nom:%s, age:%d, solde:%d\n",cl.nom,cl.age,cl.solde); 9

A l'exécution : user1@debian7:~$./a.out Nom :dupont Age :56 Solde :12000 Nom :durand Age :34 Solde :1520 Nom :martin Age :25 Solde :120 Résultat dans le fichier "essai_formate" : user1@debian7:~$ cat essai_formate nom : dupont, age : 56, solde : 12000 nom : durand, age : 34, solde : 1520 nom : martin, age : 25, solde : 120 user1@debian7:~$ 2 Lecture : Nom de la fonction : fscanf. int fscanf(file* fp, char *format, ); Si succès, retourne le nombre d'éléments lus, -1 sinon. fp : pointeur de flux du fichier où lire. format : chaîne de caractères à lire, contenant éventuellement des variables (voir scanf). 10

Exemple : Soit un fichier contenant des coordonnées de points en 3D sous la forme : X Y Z Avec un point par ligne. On lire ce fichier avec le code suivant : struct point3d float x,y,z; ; main() FILE *fp; struct point3d obj[5]; int i; fp=fopen("pyramide","r"); i=0; while(fscanf(fp,"%f %f %f",&obj[i].x,&obj[i].y,&obj[i].z)>0) printf("\npoint n %d\n",i); printf("coordonnée en x : %f\n",obj[i].x); printf("coordonnée en y : %f\n",obj[i].y); printf("coordonnée en z : %f\n",obj[i].z); i++; Avec le fichier "pyramide" suivant : -50.0 50.0 0.0 50.0 50.0 0.0-50.0-50.0 0.0 50.0-50.0 0.0 0.0 0.0 50.0 On aura le résultat suivant : user1@debian7:~$./a.out Point n 0 coordonnée en x : -50.000000 coordonnée en y : 50.000000 coordonnée en z : 0.000000 Point n 1 coordonnée en x : 50.000000 coordonnée en y : 50.000000 coordonnée en z : 0.000000 Point n 2 coordonnée en x : -50.000000 coordonnée en y : -50.000000 coordonnée en z : 0.000000 Point n 3 coordonnée en x : 50.000000 coordonnée en y : -50.000000 coordonnée en z : 0.000000 Point n 4 coordonnée en x : 0.000000 coordonnée en y : 0.000000 coordonnée en z : 50.000000 11

VI Positionnement dans un flux : Nom de la fonction : fseek int fseek(file *fp, long nb, int depart); Si succès, retourne 0, -1 sinon. fp : pointeur du flux dont on veut déplacer la tête de lecture/écriture. nb : valeur du déplacement en octets. depart : point de départ du déplacement. La valeur de "depart" peut être : - SEEK_SET : la nouvelle position sera calculée par rapport au début du fichier o nouvelle_position=nb - SEEK_CUR : la nouvelle position sera calculée par rapport à la position actuelle o nouvelle_position=position_actuelle+nb - SEEK_END : la nouvelle position sera calculée par rapport à la fin du fichier o nouvelle_position=fin_du_fichier+nb Pour une valeur de SEEK_CUR ou SEEK_END, nb peut être positif ou négatif (on peut reculer dans le fichier). Pour SEEK_SET, nb ne peut être que positif (on ne peut reculer au-delà du début du fichier). Le cas où le départ est la fin du fichier (SEEK_END) et le déplacement positif aura le même effet que pour l'appel-système lseek (cf Chapitre 1, V). Nom de la fonction : ftell long ftell(file *fp); Si succès, retourne la position de la tête de lecture/écriture, -1 sinon. fp : pointeur de flux du fichier. 12

Nom de la fonction : rewind void rewind(file *fp); Aucune. fp : pointeur de flux du fichier. rewind ramène la tête de lecture/écriture au début du fichier concerné. C'est l'équivalent de fseek(fp,0,seek_set). 13

VII Fermeture de fichier : Nom de la fonction : fclose int fclose(file *fp); Si succès, retourne 0, EOF sinon. fp : pointeur de flux du fichier à fermer. Un appel à fclose provoque le vidage du buffer associé au flux et libère le pointeur de flux. NB : Seul les buffers niveau utilisateur sont vidés lors d'un appel à fclose, pas les buffers niveau noyau 14

VIII Buffering : La grande différence entre les E/S de bas-niveau et les E/S de la librairie standard, c'est l'utilisation de tampons en mode utilisateur par ces dernières. Elles gèrent automatiquement, et de manière transparente pour l'utilisateur des buffers mémoires permettant d'optimiser le nombre d'accès disques. Il existe trois types de buffering : - Fully Buffered : les E/S sont réellement effectuées quand le tampon d'e/s est plein. C'est le mode de buffering utilisé par défaut pour les fichiers sur le disque. Le tampon utilisé est alloué lors de la première E/S effectuée sur le flux. - Line Buffered : Les E/S sont réellement effectuées lorsqu'un un caractère "newline" est rencontré en entrée ou en sortie ou lorsque le tampon est plein. C'est le mode de buffering par défaut des E/S des terminaux, notamment de la sortie standard et de l'entrée standard. C'est pour cette raison qu'il faut mettre un "\n" dans un printf pour être sur que l'affichage se fera bien à l'endroit voulu dans le code. - Unbuffered : Il n'y a pas de tampon : les E/S se feront immédiatement après les appels-système. C'est le mode de buffering par défaut de la sortie d'erreur standard : en effet, on veut que les erreurs soient affichées dès qu'elles se produisent, sans délai. Il est possible de modifier le mode de buffering d'un flux avec la fonction setvbuf. Nom de la fonction : setvbuf int setvbuf(file *fp, char *buf, int mode, size_t nb); Si succès, retourne 0, -1 sinon. fp : pointeur du flux dont on veut modifier le mode de buffering. buf : adresse mémoire du tampon à utiliser. mode : type de buffering : - _IOFBF : fully buffered - _IOLBF : line buffered - _IONBF : unbuffered nb : taille du buffer en octets. Si le mode est _IONBF, buf et nb sont ignorés. On peut laisser le noyau choisir l'adresse du buffer et sa taille en donnant la valeur NULL à buf. setvbuf doit être appelée après l'ouverture du flux, mais avant toute opération d'e/s sur le flux. 15

IX : Fonctions diverses : int feof(file *fp); Retourne une valeur supérieure à 0 si la fin du fichier pointé par fp est atteinte, 0 sinon. int fileno(file *fp); Retourne le descripteur de fichier associé au fichier pointé par le flux fp. On peut alors utiliser les appels-système du SGF sur ce fichier grâce à ce descripteur. FILE *fdopen(int fd, char *mode); Ouvre un flux à partir d'un descripteur de fichier existant fd, le mode d'ouverture sera donné dans mode (voir fopen). Retourne le pointeur de flux associé. int fflush(file *fp); Force l'écriture de toutes les données mises en tampon pour le fichier pointé par le flux fp. Si fp==null, tous les flux en sortie seront vidés (buffers niveau utilisateur seulement, voir fclose). 16