Cours gratuits » Cours informatique » Cours programmation » Cours langage C » Cours Introduction au langage C les fichiers pdf

Cours Introduction au langage C les fichiers pdf


Télécharger



★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

 
 

Introduction au langage C

 

Neuvième cours

Les fichiers

 

     

Aurélien Max

   

caractères en C mais une convention:

–    tableau de caractères

–    terminateur de chaîne (

fonctions de la bibliothèque standard (

–    entrées/sorties: puts – taille des chaînes:

–    copie de chaînes:

–    concaténation de chaînes:

–    comparaison de chaînes:

–    recherche dans des chaînes:

–    éclatement d’une chaîne: – conversion de chaîne:

Rappel de l’épisode précédent

Il n’existe pas de type prédéfini pour les chaînes de

\0)

L’accès aux chaînes peut se faire caractère par caractère en utilisant des pointeurs sur caractère, ou en utilisant des string.h):

, gets, printf, scanf strlen

strcpy, strncpy

strcat, strncat

strcmp strchr, strstr, …

strtok strtod, strtol, …

Support pour des expressions régulières simples (regex.h)

2

 

•   Type d’archivage

–  Forme binaire:

des données

–  Forme formatée:

•   Type d’accès

–  Accès séquentiel:

elles apparaissent – Accès direct:

magnétiques)

Rappels sur les fichiers

   

d’enregistrements

• fichiers (avec

(

(données binaires

données sur disque

Les fichiers en C

recopie des données telles qu’elles sont en mémoire

ne peut être relue que dans un environnement utilisant le même codage

suite d’octets contenant des codes de caractères

ne peut être relue que dans un environnement utilisant le même codage de caractères: beaucoup plus portable que la forme binaire

on accède aux données (en lecture et écriture) dans l’ordre dans lequel

on accède aux données (en lecture et écriture) par leur numéro d’ordre les enregistrements (blocs de données) doivent être de la même taille possible uniquement sur certains supports (ex: pas sur les bandes

3

Les fichiers sont considérés comme des suites d’octets quelconque (pas de notion

)

Les entrées-sorties en C sont un cas particulier de stdin et stdout comme flux)

En plus des fonctions d’entrées-sorties clavier/écran), C dispose de fonction permettant d’écrire et de lire dans des fichiers sans formatage

)

Support pour l’accès séquentiel et l’accès direct aux

4

 

structure de type FILE

– un indicateur d’erreur

– un indicateur de fin de fichier

puissent être copiés

Notion de flux

   

•   et fichiers formatés (texte)

•   distinguer les deux formats

–  transfert binaire:

–  transfert formaté:

–  transfert mixte: fputc

•   Règle à suivre:

Types de fichiers

Au moment de son ouverture, un fichier est associé à un nom interne qui est un pointeur sur une

Une variable de type (FILE *) s’appelle un flux Les propriétés d’un flux incluent notamment: un pointeur à l’intérieur du fichier

La norme n’impose pas que des flux de fichiers

5

La norme n’impose pas de distinctions entre fichiers binaires

L’implémentation du compilateur peut donc si elle le souhaite

On peut ensuite appliquer n’importe quelles opérations, indépendamment du mode d’ouverture:

fread, fwrite

fscanf, fprintf, fgets, fputs

, fgetc

pour des fichiers qui seront réutilisés ailleurs, on utilise le mode texte afin d’assurer le transcodage entre code interne et code externe pour des fichiers qui ne seront manipulés que par des programmes C dans la même implémentation, on peut utiliser le mode binaire

6

 
 

prochaine lecture ou écriture.

• se spécifier à l’octet près.

Types d’accès

   

• manipule des fichiers:

–    droits d’accès incompatibles

–    l’unité de stockage est saturée

–    erreur matérielle

C:

–    variable de type FILE * inexistante –

fichiers.

Traitement des erreurs (1/3)

 

Le mode d’ouverture ne conditionne pas le type d’accès possible (séquentiel ou direct).

Les fonctions ne sont pas spécifiques au mode d’accès. Elles modifient simplement un pointeur dans le fichier correspondant à l’emplacement de la

La notion d’enregistrement n’existant pas, un pointeur vers un emplacement dans un fichier peut

7

De nombreux types d’erreurs peuvent survenir lorsque l’on

ouverture en écriture d’un fichier inexistant rencontre de fin de fichier lors d’une lecture

Il existe également des types d’erreurs propres au langage

pointeur pour l’accès direct pointant vers un emplacement inadapté La plupart des erreurs ne mettent pas fin à l’exécution du programme. Cependant, le langage C ne permet une gestion très homogène des erreurs liés à la manipulation des

8

 
 

•   case ou une variable de flux (

•   La fonction ferror

variables.

•   La fonction feof fichier:

(

attendues) des fins de fichiers anormales

Traitement des erreurs (2/3)

   

fin de fichier…)

Traitement des erreurs (3/3)

 

La norme ne précise pas comment doit réagir un programme dans le FILE *) est malformée.

permet de connaître la dernière erreur associée à

une variable de flux. En pratique, certaines implémentations ne répercutent pas toutes les erreurs sur l’indicateur associée à ces

permet de savoir si un flux a rencontré une fin de

il faut qu’un lecture ait été interrompu pour que l’indicateur soit positionné donc lire le dernier octet d’un fichier ne positionne pas l’indicateur)

il est néanmoins possible d’écrire à n’importe quel endroit d’un fichier, tant que l’on ne dépasse pas la capacité de l’unité concernée c’est donc au programme de distinguer les fins de fichiers normales (i.e.

en mode d’accès direct, la plupart des implémentations positionnent l’indicateur si le pointeur dans le fichier dépasse la fin du fichier

9

Il est donc recommandé de tester les valeurs de retours des différentes fonctions. Cependant:

certaines retournent un pointeur, d’autres un entier et une valeur EOF (-1) en cas d’erreur (pas nécessairement une

les fonctions ne détectent pas les mêmes types d’erreurs l’utilisation d’un tampon d’écriture peut très bien retardé une erreur d’écriture (écriture différée)

10

 
 

• La fonction fopen fclose

– deux)

Ouverture et fermeture d’un fichier

   

•   Prototype de fopen:

FILE *fopen(const

•   mode:

– principal (obligatoire):

•   r: lecture d’un fichier existant

existant ou nouveau

– mode d’ouverture (facultatif):

•     b: flux binaire

•     t: flux texte (par défaut) – mise à jour (facultatif):

•     +:

Ouverture d’un fichier

 

char *fichier, const char *mode)

w: écriture dans un nouveau fichier ou écrasement d’un fichier existant a: extension, i.e. ajout de nouvelles informations à la fin d’un fichier autorise à la fois la lecture et l’écriture

12

 

permet d’ouvrir un fichier,

permet de fichier un fichier ouvert Le mode d’ouverture d’un fichier indique:

si le fichier doit ou non exister, et s’il doit être créé les types d’opérations possibles (lecture, écriture, ou les

indique le type de format (binaire ou texte) pour les implémentations où la distinctions se fait

11

 
 
 

•      r: lecture seule et en mode texte

•      w: écriture seule et mode texte

•      a: extension et mode texte

•      rb: lecture seule et mode binaire

•      d’un fichier qui doit exister

•      d’un fichier qui doit exister

•      …

Exemples de modes d’ouverture de fichier

   

fonction fwrite

•   Prototype:

size_t fwrite(const nblocs, FILE *flux) adr:

–    taille: taille – nblocs:

•   Erreurs possibles:

–    manque de place sur l’unité

–    erreur matérielle

–    erreur de flux

Ecriture en mode binaire

 

Ecriture de blocs d’octets consécutifs dans un fichier par la

void *adr, size_t taille, size_t

 adresse en mémoire des données copiées vers le fichier en octet d’un bloc de données nombre de blocs à écrire

Valeur de retour: nombre de blocs effectivement écrits

pointeur positionné avant le début de fichier

14

 

r+: mise à jour (lecture et écriture) en mode texte

w+: mise à jour (lecture et écriture) en mode texte d’un fichier qui peut exister ou non

rb+: mise à jour (lecture et écriture) en mode binaire

13

 
 

struct point { char nom; int struct point points[NB_POINTS]; int nbBlocs; FILE *sortie; /* … */

sortie = fopen(«monFichier», «wb»); if (sortie == NULL) {

exit(-1);

} nbBlocs = sortie);

if (nbBlocs != NB_POINTS)

exit(-1);

} fclose(sortie);

Exemple

   

fread

•   Prototype:

size_t fread(void

*flux) adr:

taille: taille

nblocs: nombre de blocs à écrire

•   Erreurs possibles:

– pointeur positionné après la fin de fichier

– rencontre de la fin de fichier

– erreur matérielle

– erreur de flux

•   Exemple: nbBlocs = entree)

if (feof(entree)) /* fin de fichier if (nbBlocs !=

Lecture en mode binaire

 

x, y;};

printf(«Impossible de créer le fichier»);

 fwrite(&points[0], sizeof(struct point), NB_POINTS,

{

printf(«Erreur d’écriture dans le fichier»);

15

Lecture de blocs d’octets consécutifs dans un fichier par la fonction

*adr, size_t taille, size_t nblocs, FILE

 adresse en mémoire ou seront stockées les données lues en octet d’un bloc de données

Valeur de retour: nombre de blocs effectivement lus

 fread(&monPoint, sizeof(struct point), 1,

 1) /* erreur de lecture

16

 
 

fgets (

int

[,liste_expressions]); int

[,liste_adresses]); int fputs(const

*flux);

Opérations en mode formaté

   

char nom; int x, y, nbVals; FILE *entree; /* … */ entree = fopen(«monFichier», «r»); if (!entree) {

exit(-1);

} while(1) { nbVals = if (feof(entree)) { if (nbVals ==

break; }

else {

} if (nbVals !=

} fclose(entree);

Exemple

 

Les opérations de lecture/écriture en mode formaté s’effectuent avec les fonction fprintf, fscanf, fputs et voir cours sur les chaînes de caractères):

fprintf(FILE *flux, const char * format

fscanf(FILE *flux, const char *format

char* chaine, FILE *flux);

char *fgets(char *chaine, int nbCar, FILE

17

printf(«Erreur d’ouverture du fichier;»);

 fscanf(entree, «%c%d%d», &nom, &x, &y);

 EOF) { printf(«Fin de fichier normale»);

 printf(«Fin de fichier anormale!!»; break;}

 3) {printf(«Erreur de lecture»); break; }

18

 
           

 

 
 

fputc (fgetc) quelconque:

•      Prototypes int fputc(int int fgetc(FILE *flux)

•      Le premier paramètre de caractère non signé

•      La valeur de retour de réellement écrit ou

•      La valeur de retour de converti en entier, fichier

Fonctions de lecture/écriture de caractères

   

•   d’un fichier.

•   La fonction fseek octet quelconque:

int fseek (

•   deplacement l’origine

•   origine:

SEEK_SET:

SEEK_CUR:

SEEK_END:

L’accès direct

 

L’accès direct se fait indépendamment du mode d’ouverture

Il se réalise par le déplacement d’un pointeur dans le fichier.

permet de positionner ce pointeur sur un

FILE *flux, long deplacement, int origine) spécifie un nombre d’octets par rapport à

 début du fichier (deplacement >= 0)  position actuelle du pointeur  fin du fichier (deplacement <=0)

Valeur de retour: 0 en cas de succès, valeur non nulle sinon

20

 

 envoie (lit) un caractère sur un flux c, FILE *flux)

fputc sera converti en

fputc est le caractère

EOF

fgetc est le caractère lu

EOF en cas d’erreur ou de fin de

19

 
 

•   La fonction ftell revenir plus tard

•   Prototype:

long ftell (FILE *flux

•   Utilisation possible:

long position; /* … */

position = ftell(fichier);

/* … */

fseek(fichier, position, SEEK_SET);

•   Détermination de la taille d’un fichier:

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

Position du pointeur dans un fichier

   

• Mise à jour d’un fichier existant

– ne sont pas connues

Types d’utilisation de l’accès direct

 

permet de mémoriser la position du pointeur pour y

)

Valeur de retour: position courante du pointeur ou   -1 en cas d’erreur

21

Accélération de la consultation d’un fichier existant on ne consulte que les blocs qui nous intéresse

on ne met à jour sur disque que ceux qui doivent l’être

Création d’un fichier en accès direct permet de ne pas spécifier certaines valeurs lorsqu’elles

22

 
 

95