Sie sind auf Seite 1von 4

Rappel de lpisode prcdent

Il nexiste pas de type prdfini pour les chanes de caractres en C mais une convention:
tableau de caractres terminateur de chane (\0)

Introduction au langage C
Neuvime cours Les fichiers

Laccs aux chanes peut se faire caractre par caractre en utilisant des pointeurs sur caractre, ou en utilisant des fonctions de la bibliothque standard (string.h):
entres/sorties: puts, gets, printf, scanf taille des chanes: strlen copie de chanes: strcpy, strncpy concatnation de chanes: strcat, strncat comparaison de chanes: strcmp recherche dans des chanes: strchr, strstr, clatement dune chane: strtok conversion de chane: strtod, strtol,
2

Aurlien Max aurelien.max@limsi.fr

Support pour des expressions rgulires simples (regex.h)

Rappels sur les fichiers


Type darchivage
Forme binaire:
recopie des donnes telles quelles sont en mmoire ne peut tre relue que dans un environnement utilisant le mme codage des donnes

Les fichiers en C
Les fichiers sont considrs comme des suites doctets quelconque (pas de notion denregistrements) Les entres-sorties en C sont un cas particulier de fichiers (avec stdin et stdout comme flux) En plus des fonctions dentres-sorties (clavier/cran), C dispose de fonction permettant dcrire et de lire dans des fichiers sans formatage (donnes binaires) Support pour laccs squentiel et laccs direct aux donnes sur disque
3 4

Forme formate:
suite doctets contenant des codes de caractres ne peut tre relue que dans un environnement utilisant le mme codage de caractres: beaucoup plus portable que la forme binaire

Type daccs
Accs squentiel:
on accde aux donnes (en lecture et criture) dans lordre dans lequel elles apparaissent

Accs direct:
on accde aux donnes (en lecture et criture) par leur numro dordre les enregistrements (blocs de donnes) doivent tre de la mme taille possible uniquement sur certains supports (ex: pas sur les bandes magntiques)

Notion de flux
Au moment de son ouverture, un fichier est associ un nom interne qui est un pointeur sur une structure de type FILE Une variable de type (FILE *) sappelle un flux Les proprits dun flux incluent notamment:
un pointeur lintrieur du fichier un indicateur derreur un indicateur de fin de fichier

Types de fichiers
La norme nimpose pas de distinctions entre fichiers binaires et fichiers formats (texte) Limplmentation du compilateur peut donc si elle le souhaite distinguer les deux formats On peut ensuite appliquer nimporte quelles oprations, indpendamment du mode douverture:
transfert binaire: fread, fwrite transfert format: fscanf, fprintf, fgets, fputs transfert mixte: fputc, fgetc

Rgle suivre:
pour des fichiers qui seront rutiliss ailleurs, on utilise le mode texte afin dassurer le transcodage entre code interne et code externe pour des fichiers qui ne seront manipuls que par des programmes C dans la mme implmentation, on peut utiliser le mode binaire
5 6

La norme nimpose pas que des flux de fichiers puissent tre copis

Types daccs
Le mode douverture ne conditionne pas le type daccs possible (squentiel ou direct). Les fonctions ne sont pas spcifiques au mode daccs. Elles modifient simplement un pointeur dans le fichier correspondant lemplacement de la prochaine lecture ou criture. La notion denregistrement nexistant pas, un pointeur vers un emplacement dans un fichier peut se spcifier loctet prs.

Traitement des erreurs (1/3)


De nombreux types derreurs peuvent survenir lorsque lon manipule des fichiers:
ouverture en criture dun fichier inexistant droits daccs incompatibles lunit de stockage est sature erreur matrielle rencontre de fin de fichier lors dune lecture

Il existe galement des types derreurs propres au langage C:


variable de type FILE * inexistante pointeur pour laccs direct pointant vers un emplacement inadapt

La plupart des erreurs ne mettent pas fin lexcution du programme. Cependant, le langage C ne permet une gestion trs homogne des erreurs lis la manipulation des fichiers.
7 8

Traitement des erreurs (2/3)


La norme ne prcise pas comment doit ragir un programme dans le case ou une variable de flux (FILE *) est malforme. La fonction ferror permet de connatre la dernire erreur associe une variable de flux. En pratique, certaines implmentations ne rpercutent pas toutes les erreurs sur lindicateur associe ces variables. La fonction feof permet de savoir si un flux a rencontr une fin de fichier:
il faut quun lecture ait t interrompu pour que lindicateur soit positionn (donc lire le dernier octet dun fichier ne positionne pas lindicateur) il est nanmoins possible dcrire nimporte quel endroit dun fichier, tant que lon ne dpasse pas la capacit de lunit concerne cest donc au programme de distinguer les fins de fichiers normales (i.e. attendues) des fins de fichiers anormales en mode daccs direct, la plupart des implmentations positionnent lindicateur si le pointeur dans le fichier dpasse la fin du fichier

Traitement des erreurs (3/3)


Il est donc recommand de tester les valeurs de retours des diffrentes fonctions. Cependant:
certaines retournent un pointeur, dautres un entier et une valeur EOF (-1) en cas derreur (pas ncessairement une fin de fichier) les fonctions ne dtectent pas les mmes types derreurs lutilisation dun tampon dcriture peut trs bien retard une erreur dcriture (criture diffre)

10

Ouverture et fermeture dun fichier


La fonction fopen permet douvrir un fichier, fclose permet de fichier un fichier ouvert Le mode douverture dun fichier indique:
si le fichier doit ou non exister, et sil doit tre cr les types doprations possibles (lecture, criture, ou les deux) indique le type de format (binaire ou texte) pour les implmentations o la distinctions se fait Prototype de fopen:

Ouverture dun fichier

FILE *fopen(const char *fichier, const char *mode)

mode:
principal (obligatoire):
r: lecture dun fichier existant w: criture dans un nouveau fichier ou crasement dun fichier existant a: extension, i.e. ajout de nouvelles informations la fin dun fichier existant ou nouveau

mode douverture (facultatif):


b: flux binaire t: flux texte (par dfaut)

mise jour (facultatif):


+: autorise la fois la lecture et lcriture

11

12

Exemples de modes douverture de fichier


r: lecture seule et en mode texte w: criture seule et mode texte a: extension et mode texte rb: lecture seule et mode binaire r+: mise jour (lecture et criture) en mode texte dun fichier qui doit exister w+: mise jour (lecture et criture) en mode texte dun fichier qui peut exister ou non rb+: mise jour (lecture et criture) en mode binaire dun fichier qui doit exister
13

Ecriture en mode binaire


Ecriture de blocs doctets conscutifs dans un fichier par la fonction fwrite Prototype:
size_t fwrite(const void *adr, size_t taille, size_t nblocs, FILE *flux) adr: adresse en mmoire des donnes copies vers le fichier taille: taille en octet dun bloc de donnes nblocs: nombre de blocs crire

Valeur de retour: nombre de blocs effectivement crits Erreurs possibles:


manque de place sur lunit pointeur positionn avant le dbut de fichier erreur matrielle erreur de flux
14

Exemple
struct point { char nom; int x, y;}; struct point points[NB_POINTS]; int nbBlocs; FILE *sortie; /* */ sortie = fopen(monFichier, wb); if (sortie == NULL) { printf(Impossible de crer le fichier); exit(-1); } nbBlocs = fwrite(&points[0], sizeof(struct point), NB_POINTS, sortie); if (nbBlocs != NB_POINTS) { printf(Erreur dcriture dans le fichier); exit(-1); } fclose(sortie); 15

Lecture en mode binaire


Lecture de blocs doctets conscutifs dans un fichier par la fonction fread Prototype:
size_t fread(void *adr, size_t taille, size_t nblocs, FILE *flux) adr: adresse en mmoire ou seront stockes les donnes lues taille: taille en octet dun bloc de donnes nblocs: nombre de blocs crire

Valeur de retour: nombre de blocs effectivement lus Erreurs possibles:


pointeur positionn aprs la fin de fichier rencontre de la fin de fichier erreur matrielle erreur de flux

Exemple:
nbBlocs = fread(&monPoint, sizeof(struct point), 1, entree) if (feof(entree)) /* fin de fichier if (nbBlocs != 1) /* erreur de lecture 16

Oprations en mode format


Les oprations de lecture/criture en mode format seffectuent avec les fonction fprintf, fscanf, fputs et fgets (voir cours sur les chanes de caractres):
int fprintf(FILE *flux, const char * format [,liste_expressions]); int fscanf(FILE *flux, const char *format [,liste_adresses]); int fputs(const char* chaine, FILE *flux); char *fgets(char *chaine, int nbCar, FILE *flux);
17

Exemple
char nom; int x, y, nbVals; FILE *entree; /* */ entree = fopen(monFichier, r); if (!entree) { printf(Erreur douverture du fichier;); exit(-1); } while(1) { nbVals = fscanf(entree, %c%d%d, &nom, &x, &y); if (feof(entree)) { if (nbVals == EOF) { printf(Fin de fichier normale); break; } else { printf(Fin de fichier anormale!!; break;} } if (nbVals != 3) {printf(Erreur de lecture); break; } } fclose(entree); 18

Fonctions de lecture/criture de caractres


fputc (fgetc) envoie (lit) un caractre sur un flux quelconque: Prototypes
int fputc(int c, FILE *flux) int fgetc(FILE *flux)

Laccs direct
Laccs direct se fait indpendamment du mode douverture dun fichier. Il se ralise par le dplacement dun pointeur dans le fichier. La fonction fseek permet de positionner ce pointeur sur un octet quelconque:
int fseek (FILE *flux, long deplacement, int origine)

Le premier paramtre de fputc sera converti en caractre non sign La valeur de retour de fputc est le caractre rellement crit ou EOF La valeur de retour de fgetc est le caractre lu converti en entier, EOF en cas derreur ou de fin de fichier
19

deplacement spcifie un nombre doctets par rapport lorigine origine:


SEEK_SET: dbut du fichier (deplacement >= 0) SEEK_CUR: position actuelle du pointeur SEEK_END: fin du fichier (deplacement <=0)

Valeur de retour: 0 en cas de succs, valeur non nulle sinon


20

Position du pointeur dans un fichier


La fonction ftell permet de mmoriser la position du pointeur pour y revenir plus tard Prototype:
long ftell (FILE *flux)

Types dutilisation de laccs direct


Acclration de la consultation dun fichier existant
on ne consulte que les blocs qui nous intresse

Valeur de retour: position courante du pointeur ou -1 en cas derreur Utilisation possible:


long position; /* */ position = ftell(fichier); /* */ fseek(fichier, position, SEEK_SET);

Mise jour dun fichier existant


on ne met jour sur disque que ceux qui doivent ltre

Cration dun fichier en accs direct


permet de ne pas spcifier certaines valeurs lorsquelles ne sont pas connues

Dtermination de la taille dun fichier:


long taille; /* */ fseek(fichier, 0, SEEK_END); taille = ftell(fichier); 21 22

Das könnte Ihnen auch gefallen