Beruflich Dokumente
Kultur Dokumente
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
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.
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
10
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
11
12
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
Exemple:
nbBlocs = fread(&monPoint, sizeof(struct point), 1, entree) if (feof(entree)) /* fin de fichier if (nbBlocs != 1) /* erreur de lecture 16
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
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