Les variables fichiers
Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique –Type d’accès(binaire ou formaté … distinction floue) –Adresse du buffer –Position dans le fichier –Indicateur d’erreur Trois fichiers/flux standard, ouvert par défaut: stdin, stdout et stderr
Ouverture/Fermeture d’un fichier Faire le lien entre le nom physique (chaîne de caractère, chemin absolu ou relatif) et le nom logique (nom du pointeur) Ouvrir dans le mode choisi (binaire, écriture, écraser, lecture,…) Se positionner au début de fichier fich = fopen(nom_physique, mode); TESTER si le fichier a été ouvert (pas null). fopen(nom, ``r``); 0 si le fichier n’existe pas. fopen(nom, ``w``); 0 si le chemin d’accès est faux. fclose(fich);
Mode d’ouverture r ouverture d’un fichier texte en lecture w crée un fichier texte en écriture, écrase le contenu précédent si le fichier existait. a ajoute: ouvre ou crée un fichier texte et se positionne en écriture à la fin du fichier. r+ ouvre un fichier en mode mise à jour (lecture et écriture) w+ crée un fichier texte en mode mise à jour, écrase le contenu précédent si le fichier existait. a+ ajoute, ouvre ou crée un fichier texte en mode mise à jour et se positionne en écriture à le fin du fichier.
Exemple FILE *fich; char nom[100]; printf(``nom du fichier à lire : \n``); scanf(``%s``,nom); if( (fich=fopen(nom, ``r``)) ==NULL) exit(1);
Les entrées/sorties caractère int getc(FILE *); int fgetc(FILE *); int getchar(); int putc(FILE *); int fputc(FILE *); int putchar(); Exemple: void main(void){ int c; FILE *fich; fich = fopen(``données``, ``r``); do{ c = getc(fich); } while(c= = EOF); } Autre test sortie: int feof(FILE *) retourne pas zéro si EOF
Les entrées/sorties formatées Les fonctions fprintf() et fscanf() s’utilisent exactement de la même façon que printf et scanf, il suffit d’ajouter un paramètre pointeur de fichier: FILE *fichier; fichier = fopen(nomFichier, ``w``); int x=25; fprintf(fichier, ``%d\n``,x); Qui pourra être lu par: fscanf(fichier,``%d``,&a);
Les entrées/sorties binaires bufferisées Sur fichiers ouverts en binaire fich = fopen(monFichier, ``rb``); size_t fread(void *ptr, size_t size, unsigned int n, FILE *stream); size_t fwrite(void *ptr, size_t size, unsigned int n, FILE *stream); Principe: écrire directement la représentation machine des variables (c’est-à-dire de leur contenu mémoire) Exemple: short x =1024; fprintf(fich,``%d``,x) écrira les 4 caractères ‘1’, ‘0’, ‘2’ et ‘4’ dans le fichier texte fwrite(&x, sizeof(x), 1, fich) écrira les deux octets dans le fichier
Les entrées/sorties binaires bufferisées(2) Avantages: stockage réduit et lecture/écriture efficace. (une copie de la mémoire) Inconvénients: non portable (taille des objets diff.), non lisibles par éditeurs de textes. (créer des programmes scanf/fwrite et fread/printf C pour les convertir)
Fonction de parcours du fichier int fseek(FILE *flux, long int offset, int flag); Modifie la position du pointeur de fichier (lieu du prochain accès). Flag: –SEEK_SET début de fichier –SEEK_CUR relativement à la position courante –SEEK_END fin du fichier
Traitement des erreurs de gestion de fichier Accès à des fichiers est source d’erreurs multiples: Lors de l’ouverture (fichier inexistant, droits restrictifs, manque de place, erreur matérielle) Rencontre d’une fin de fichier Manque de place sur l’unité concernée Destruction de la structure FILE Mauvaise opération sur pointeur de fichier
Détection des erreurs Seule l’erreur matérielle est détecté par le système, toute les autres ne provoquent PAS l’arrêt du programme: il faut les traiter. Un indicateur ferror peu efficace (oui/non) int ferror(FILE *); Un indicateur errno peu fiable Détection de la fin de fichier avec feof (il faut avoir lu la fin de fichier pour la reconnaître) Consulter les valeurs de retour des fonctions
Détection des erreurs nb_ecrit = fwrite(…,nblocs,fich); Si nb_ecrit == nblocs OK, si inf: erreur nb_lu = fread(…, nblocs,fich); Si nb_lu == nblocs et !feof, OK Si nb_lu est inf. à nblocs et !feof, pb materiel Si nb_lu == 0 et feof, fin de fichier normal Si nb_lu !=0 et eof, fin de fichier anormal
Détection des erreurs ncar = fprintf(fich, …); si negatif alors pb nb_lu = fsanf (fich,…); Si nb_lu == nb_attendu et !feof, OK Si nb_lu est inf. à nb_attendu et !feof, pb materiel Si nb_lu == EOF et feof, fin de fichier normal Si nb_lu !=EOF et eof, fin de fichier anormal
Détection des erreurs c_ecrit = fputc(…,fich); c_ecrit != EOF, l’écriture s’est bien déroulé sinon, erreur d’écriture par manque de place ou erreur matériel. ret = fgetc(fich); ret != EOF et !feof lecture normale ret == EOF et !feof pb matériel feof fin de fichier normale