CM09 Fichiers
Télécharger le CM09 Fichiers en pdf
Pages : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
Page 1 : Informatique IIGestion de fichiers
Page 2 : Rappels et objectifs • Un programme permet de traiter des données texte, signaux, images, videos, input, etc...• Problèmes• Données de résultats: Les variables et données traitées sont stockéestemporairement dans la mémoire vive de la machine RAM. Elles ne sont plus accessibles une fois l'execution terminée.• Donnée d'entrés: jusqu'ici principalement saisies au clavier. Comment recupérer des données plus grandes / compliquées?• Les fichiers sont des données stockées sur de la mémoire non-volatile mémoire permanente.• Objectif : pouvoir récupérer/enregistrer des données via des fichiers à partir d'un programme C.
Page 3 : Les fichiers• Un fichier est caractérisé par ses metadonnées :• Son nom• Sa catégorie image, son, exécutable, texte, son extension• Sa taille• Son emplacement• Ses permissions lecture, écriture, exécution• ….• On peut distinguer :• Les fichiers textes codes sources, fichiers de configuration, fichiers de logs, … qui sont souvent encodés en ASCII 8 bits = 1 caractère• Les fichiers binaires dont le contenu correspond à un format précis image, musique, traitement de texte, exécutable, ….
Page 4 : Fichiers et langage C • Les accès à un fichier se font par l'intermédiaire d'une mémoire-tamponbuffer, ce qui permet de réduire le nombre d'accès aux périphériques.• Il existe deux grandes manières d'accéder/ de modifier des fichiers enlangage C :• Une méthode bas niveau utilisant des appels systèmes et des descripteurs de fichiers qui permettent de lire ou écrire des fichiers:• Rapide• Dépendante du système• Plus compliquée à utiliser.• Une méthode haut niveau se basant sur la manipulation d'unestructure et des fonctions de la bibliothèque stdio.h.• Lente à l'accès• Indépendante du système• Plus pratique d'utilisation
Page 5 : La structure FILE• Pour manipuler un fichier, nous avons besoin de:• son adresse dans le buffer• son mode d'accès• la position de la tête de lecture / d'écriture• …• Ces informations sont rassemblées dans une structure FILE définie dans stdio.h.• Pour accéder à un fichier, on utilise un pointeur sur une structure de type FILE. Ce type de variable est appellée stream ou flux.• Les champs de cette structure sont automatiquement remplis à l'aide de fonctions de stdio.h : il ne faut pas les modifier soit-même ! Les fonctions de haut niveau d'accès aux fichiers se chargent de le faire !FILE f ;
Page 6 : Accès à un fichier• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 7 : Accès à un fichier• Le mot clef const avant la décalaration d'une variable permet d'en faire uneconstante programmable : sa première affectation fixe sa valeur et samodification sera interdite par le compilateur.Exemples :const int a=10;int b = 5;b=a+b;a=2;const int a=10;int p;p = &a;// génère un warning...p = 2// ...et modifie a malgré touta=2;// toujours interdit en direct• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 8 : Accès à un fichier• nomFichier est une chaîne de caractères representant:• Le nom du fichier auquel on veut accéder s'il est dans le repertoire courant.• Chemin d'accès + nom du fichier sinonExemple :"dossier1/dossier2/fichiertexte.txt"• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 9 : Accès à un fichier• modeAcces désigne le mode d'accès au fichier. Pour ouvrir un fichier enmode ASCII :• "r": accès en lecture. Le fichier doit exister au préalable.• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 10 : Accès à un fichier• modeAcces désigne le mode d'accès au fichier. Pour ouvrir un fichier enmode ASCII :• "r": accès en lecture. Le fichier doit exister au préalable.• "w" : accès en écriture. Le fichier est crée s'il n'existe pas.• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 11 : Accès à un fichier• modeAcces désigne le mode d'accès au fichier. Pour ouvrir un fichier enmode ASCII :• "r": accès en lecture. Le fichier doit exister au préalable.• "w" : accès en écriture. Le fichier est crée s'il n'existe pas.• "a": mode ajout, on écrit dans le fichier en partant de la fin. Fichier créé s'il n'existe pas.• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 12 : Accès à un fichier• modeAcces désigne le mode d'accès au fichier. Pour ouvrir un fichier enmode ASCII :• "r": accès en lecture. Le fichier doit exister au préalable.• "w" : accès en écriture. Le fichier est crée s'il n'existe pas.• "a": mode ajout, on écrit dans le fichier en partant de la fin. Fichier créé s'il n'existe pas.• "r+" "w+" "a+" accès en lecture et écriture avec les caractéristiques de "r", "w", a".• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 13 : Accès à un fichier• modeAcces désigne le mode d'accès au fichier. Pour ouvrir un fichier enmode binaire :• "rb": accès en lecture. Le fichier doit exister au préalable.• "wb" : accès en écriture. Le fichier est crée s'il n'existe pas.• "ab": mode ajout, on écrit dans le fichier en partant de la fin. Fichier créé s'il n'existe pas.• "rb+" "wb+" "ab+" accès en lecture et écriture avec les caractéristiques de "rb", "wb", ab".• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 14 : Accès à un fichier• Exemple:FILE fichier = NULL;// ouverture du fichier test.txt en mode lecture et écriturefichier = fopen"test.txt", "r+";• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 15 : Accès à un fichier• Exemple:int main int argc, char argvFILE fichier = NULL;fichier = fopenargv1, "a";...• Pour accéder à un fichier, il faut l'ouvrir. La fonction fopen retourne un pointeur sur FILE et permet d'accéder à un fichier:FILE fopen const char nomFichier, const char modeAcces
Page 16 : Accès à un fichier• Le pointeur fichier devrait contenir l'adresse de la structure de type FILE qui sert de descripteur de fichier.• Il est possible que l'ouverture échoue. Toujours vérifier que le fichier est bien accessible via le flux :FILE fichier = NULL;// ouverture du fichier test.txt en lecture/écriturefichier = fopen"test.txt", "r+";if fichier == NULLprintf"Ouverture du fichier impossible\n";printf"code d'erreur= d \n", errno;printf"Message d'erreur = s \n", strerrorerrno ;exit1;toujours vérifier les retours de fonctions ET vérifier les pointeurs avant d'utilisation
Page 17 : Accès à un fichier• Pour l'ensemble des fonctions de haut niveau de gestion de fichiers ici la fonction fopen, mais aussi toutes celles qui vont suivre, et celles qui ne seront pas forcément explicitées dans ce document il faudra utiliser la variable globale errno pour connaître la raison précise d'un dysfonctionnement• Si l'on souhaite afficher le message d'erreur précis, associé au code d'erreur stocké dans errno, il existe une fonction strerror qui prend en entrée le code errno et qui renvoie une chaîne de caractèresprintf"code d'erreur = d \n", errno ;printf"Message d'erreur = s \n", strerrorerrno ;
Page 18 : Fermeture d'un fichier• Une fois qu'on a travaillé avec le fichier, il faut fermer la connexion avec ce dernier : cela libèrera la mémoire tampon utilisée.• Pour fermer un fichier:• ExempleFILE fichier = NULL;// ouverture du fichier test.txt en lecture/écriturefichier = fopen"test.txt", "r+";if fichier == NULLprintf"Ouverture du fichier impossible";exit1;…fclosefichier;int fcloseFILE flux;
Page 19 : Lecture d'un fichier• La lecture d'un fichier ouvert en ASCII permet de récupérer un ou plusieurscaractères en début de fichier.• La fonction fgetc permet de récupérer un caractère.int fgetc FILE pointeurDeFichier
Page 20 : Lecture d'un fichier• La lecture d'un fichier ouvert en ASCII permet de récupérer un ou plusieurscaractères en début de fichier.• La fonction fgetc permet de récupérer un caractère.int fgetc FILE pointeurDeFichier• Retourne un caractère ou EOF si le fichier est vide ou que l'on est à la fin. Le retour peut donc prendre 256 valeurs pour l'octet récupéré + 1 valeurEOF en cas d'erreur : 257 valeurs ne peuvent pas tenir sur 1 octet donc un type int est retourné :FILE fichier = NULL;fichier = fopen"test.txt", "r+";int a;// a prend la valeur de la première lettre du fichiera = fgetcfichier;
Page 21 : Lecture d'un fichier• La lecture d'un fichier ouvert en ASCII permet de récupérer un ou plusieurscaractères en début de fichier.• La fonction fgets permet de récupérer plusieurs caractères à la suite :char fgetschar ChaineAremplir, int nmblettre, FILE fichier • /!\ la lecture s'arrete lorsque l'on rencontre un saut de ligne '\n' tel que définidans la table ASCII ou lorque l'on arrive à la fin du fichier le premier des 2.• Retourne un pointeur sur la chaîne et NULL en cas d'échec.• Ajoute automatiquement '\0' à la fin de la chaîne.FILE fichier = NULL;fichier = fopen"test.txt", "r+";char phrase200;//récupère la première ligne ou les 200 premiers caractères du fichierfgetsphrase, 199, fichier;
Page 22 : Lecture d'un fichier• La lecture d'un fichier ouvert en ASCII permet de récupérer un ou plusieurscaractères en début de fichier.• La fonction fscanf est l'équivalent de scanf mais va analyser une chaînevenant d'un fichier plutot que venant des entrées clavier:int fscanfFILE fichier, "format", &Variable • Lit le fichier, traduit au format désiré et place les valeurs dans les variables• Retourne le nombre de variables mises à jour si la lecture s'est bien passée, EOF sinon.FILE fichier = NULL;fichier = fopen"test.txt", "r+";int a;fscanffichier, "d", &a;
Page 23 : Lecture d'un fichier15 20 18FILE fichier = NULL;fichier = fopen"test.txt", "r+";int a;fscanffichier, "d", &a;• La lecture d'un fichier ouvert en ASCII permet de récupérer un ou plusieurscaractères en début de fichier.• La fonction fscanf est l'équivalent de scanf mais va analyser une chaînevenant d'un fichier plutot que venant des entrées clavier:int fscanfFILE fichier, "format", &Variable • L'utilisation de cette fonction nécessite de bien connaître le contenu dufichier à lire avoir une spécification précise et surtout être certain que cefichier est un fichier encodé en ASCII !• Ex:
Page 24 : Lecture d'un fichier15 20 18FILE fichier = NULL;fichier = fopen"test.txt", "r+";int a;fscanffichier, "d", &a;a = 15• La lecture d'un fichier ouvert en ASCII permet de récupérer un ou plusieurscaractères en début de fichier.• La fonction fscanf est l'équivalent de scanf mais va analyser une chaînevenant d'un fichier plutot que venant des entrées clavier:int fscanfFILE fichier, "format", &Variable • L'utilisation de cette fonction nécessite de bien connaître le contenu dufichier à lire avoir une spécification précise et surtout être certain que cefichier est un fichier encodé en ASCII !• Ex:
Page 25 : Lecture d'un fichier15.20 18FILE fichier = NULL;fichier = fopen"test.txt", "r+";float a;fscanffichier, "f", &a;a = 15.2• La lecture d'un fichier ouvert en ASCII permet de récupérer un ou plusieurscaractères en début de fichier.• La fonction fscanf est l'équivalent de scanf mais va analyser une chaînevenant d'un fichier plutot que venant des entrées clavier:int fscanfFILE fichier, "format", &Variable • L'utilisation de cette fonction nécessite de bien connaître le contenu dufichier à lire avoir une spécification précise et surtout être certain que cefichier est un fichier encodé en ASCII !• Ex:
Page 26 : Lecture d'un fichier152018FILE fichier = NULL;fichier = fopen"test.txt", "r+";int a;fscanffichier, "d", &a;a = 152018• La lecture d'un fichier ouvert en ASCII permet de récupérer un ou plusieurscaractères en début de fichier.• La fonction fscanf est l'équivalent de scanf mais va analyser une chaînevenant d'un fichier plutot que venant des entrées clavier:int fscanfFILE fichier, "format", &Variable • L'utilisation de cette fonction nécessite de bien connaître le contenu dufichier à lire avoir une spécification précise et surtout être certain que cefichier est un fichier encodé en ASCII !• Ex:
Page 27 : Lecture d'un fichier en mode binaire• La lecture d'un fichier ouvert en binaire permet de récupérer un ou plusieursoctets en début de fichier.int freadvoid ptr, int taille, int nombre, FILE flux;• fread lit nombre éléments de taille octets depuis le flux flux et les stockent dans la zone mémoire pointée par ptr.• Pour récupérer un int:FILE fichier = NULL;fichier = fopen"test.txt", "rb+";int a;fread&a, sizeofint,1, fichier;
Page 28 : Lecture d'un fichier en mode binaireFILE fichier = NULL;fichier = fopen"test", "rb+";float tabTAILLEfreadtab, sizeoffloat,TAILLE, fichier;• La lecture d'un fichier ouvert en binaire permet de récupérer un ou plusieursoctets en début de fichier.int freadvoid ptr, int taille, int nombre, FILE flux;• fread lit nombre éléments de taille octets depuis le flux flux et les stockent dans la zone mémoire pointée par ptr.• Pour récupérer un tableau:
Page 29 : Ecriture dans un fichier ASCII• L'ouverture d'un fichier au format ASCII permet d'y écrire du texte.• On a :• Ajoute un caractère à l'endroit où se situe le pointeur d'écriture au début ou à la fin du fichier selon le mode d'ouverture.• Retourne le caractère ajouté ou la valeur EOF en cas d'échec.•Le caractère en argument est de type int pour être cohérent avec le retour de fgetc rappelez-vous, on peut retourner 257 valeurs distinctesint fputc int caractere, FILE flux ;FILE fichier = NULL;// ouverture du fichier test.txt en lecture/écriturefichier = fopen"test.txt", "r+";// ajoute le caractère A en début de fichier.fputc'A', fichier;
Page 30 : Ecriture dans un fichier ASCII• L'ouverture d'un fichier au format ASCII permet d'y écrire du texte.• On a :• Ecrit une chaîne de caractères au début ou à la fin du fichier selon le mode d'ouverture.• Retourne une valeur non-negative en cas de succès ou EOF en cas d'échec.FILE fichier = NULL;// ouverture du fichier test.txt en lecture/écriturefichier = fopen"test.txt", "r+";// ajoute la phrase en début de fichier.fputs"je suis dans le fichier", fichier;int fputs const char chaine, FILE flux ;
Page 31 : Ecriture dans un fichier ASCII• L'ouverture d'un fichier au format ASCII permet d'y écrire du texte.• On a :• Ecrit une chaîne de caractères au début ou à la fin du fichier selon le mode d'ouverture.• Retourne une valeur non-negative en cas de succès ou EOF en cas d'échec.FILE fichier = NULL;// ouverture du fichier test.txt en lecture/écriturefichier = fopen"test.txt", "r+";// ajoute la chaine mot en début de fichier.char mot= "je suis dans le fichier";fputsmot, fichier;int fputs const char chaine, FILE flux ;
Page 32 : Ecriture dans un fichier ASCII• L'ouverture d'un fichier au format ASCII permet d'y écrire du texte.• On a :• Ecrit une chaîne de caractères formatée au début ou à la fin du fichierselon le mode d'ouverture.• Retourne le nombre de caractères écrits en sortie en cas de succès ou EOF en cas d'échec.• Préférer fputs plutot que fprintf pour des chaines non formatées pour des raisons évidentes de performancesint age , ans;FILE fichier = NULL;fichier = fopen"test.txt", "r+";printf"quel est ton age : ";scanf"d", &age;ans = 2022-age;// ajoute la phrase en début de fichier.fprintf fichier, "Tu es née en d \n", ans;int fprintfFILE flux, const char chaine, ;
Page 33 : Ecriture dans un fichier ASCII• L'ouverture d'un fichier au format ASCII permet d'y écrire du texte.• Attention:•Ajoute val au fichier comme une chaîne de caractères.Ex: val =15 •ajoute au fichier les caractères '1' et '5' et non pas l'équivalent binairede 15 0x0F.•fprintf doit être utilisé avec des fichiers ouverts en mode ASCIIint val;FILE fichier = NULL;fichier = fopen"test.txt", "r+";scanf"d", &val ;// ajoute la phrase en début de fichier.fprintf fichier, "d", val;
Page 34 : Ecriture dans un fichier binaire• L'ouverture d'un fichier au format binaire permet d'y ajouter des octets, doncdes valeurs binaires .•La fonction fwrite permet d'écrire un certains nombre d'octets à un fichierbinaire :int fwritevoid ptr, int taille, int nmbelements, FILE fichier
Page 35 : Ecriture dans un fichier binaireint val;FILE fichier = NULL;fopen"fichiertest","rb+";scanf"d",&val;// ajoute la variable en début de fichier.fwrite &val, sizeofint, 1, fichier;• L'ouverture d'un fichier au format binaire permet d'y ajouter des octets, doncdes valeurs binaires .•La fonction fwrite permet d'écrire un certains nombre d'octets à un fichierbinaire :int fwritevoid ptr, int taille, int nmbelements, FILE fichier•Exemple 1 :
Page 36 : Ecriture dans un fichier binaireint val;FILE fichier = NULL;fopen"fichiertest","rb+";double tab10=…;// ajoute la variable en début de fichier.fwritetab, sizeofdouble, 10, fichier;• L'ouverture d'un fichier au format binaire permet d'y ajouter des octets, doncdes valeurs binaires .•La fonction fwrite permet d'écrire un certains nombre d'octets à un fichierbinaire :int fwritevoid ptr, int taille, int nmbelements, FILE fichier•Exemple 2 :
Page 37 : Ecriture dans un fichier binaire vs ASCII• Lorsque l'on souhaite sauvegarder des variables complexes, fwrite est plus pratique que fprintf.• Exemple: la sauvegarde de structure:typedef struct int age;char nom30;char prenom30;char adresse60;int nombreFreres;Personne ;Personne gens;
Page 38 : Ecriture dans un fichier binaire vs ASCII• Lorsque l'on souhaite sauvegarder des variables complexes, fwrite est plus pratique que fprintf.• Exemple: la sauvegarde de structure:typedef struct int age;char nom30;char prenom30;char adresse60;int nombreFreres;Personne ;Personne gens; Stockage de gens dans un fichier asciifprintffichier , "d\n" , gens.age;fprintf fichier , "s\n" , gens.nom;fprintf fichier , "s\n" , gens.prenom;fprintf fichier , "s\n" , gens.adresse;fprintf fichier , "d\n" , gens.nombreFreres;
Page 39 : Ecriture dans un fichier binaire vs ASCII• Lorsque l'on souhaite sauvegarder des variables complexes, fwrite est plus pratique que fprintf.• Exemple: la sauvegarde de structure:typedef struct int age;char nom30;char prenom30;char adresse60;int nombreFreres;Personne ;Personne gens; Stockage de gens dans un fichier binairefwrite &gens ,sizeofPersonne , 1 , fichier;
Page 40 : Déplacement dans un fichier• Le mode d'accès permet d'écrire au début "w" "r+" ou à la fin "a+" d'un fichier.• Comment accéder au reste du fichier ? Lire ou valeur particulière ou bien le fichier entier ?• Exemple : comment stocker les valeurs du fichier suivant dans un tableau pour pouvoir les traiter?5101004882345
Page 41 : Déplacement dans un fichier : déplacement par la lecture• Comme lorsque l'on ouvre "normalement" un fichier, un curseur ou têtes de lecture/écriture indique l'emplacement où le se trouve dans ce fichier. Il estpossible de le déplacer.• Lorsque l'on lit un ou plusieurs caractères avec une des fonctions de lecture,le curseur de lecture se déplace après les caractères lus.FILE fichier = NULL;fichier = fopen"test.txt", "r";char c1, c2, c3;c1 = fgetcfichier;c2 = fgetcfichier;c3 = fgetcfichier;abcdtest.txt
Page 42 : Déplacement dans un fichier : déplacement par la lectureFILE fichier = NULL;fichier = fopen"test.txt", "r";char c1, c2, c3;c1 = fgetcfichier;c2 = fgetcfichier;c3 = fgetcfichier;abcdtest.txtLe fichier est ouvert en mode r+ : le curseur est au début• Comme lorsque l'on ouvre "normalement" un fichier, un curseur ou têtes de lecture/écriture indique l'emplacement où le se trouve dans ce fichier. Il estpossible de le déplacer.• Lorsque l'on lit un ou plusieurs caractères avec une des fonctions de lecture,le curseur de lecture se déplace après les caractères lus.
Page 43 : Déplacement dans un fichier : déplacement par la lectureFILE fichier = NULL;fichier = fopen"test.txt", "r";char c1, c2, c3;c1 = fgetcfichier;c2 = fgetcfichier;c3 = fgetcfichier;abcdtest.txtLe fichier est ouvert en mode r+ : le curseur est au début• Comme lorsque l'on ouvre "normalement" un fichier, un curseur ou têtes de lecture/écriture indique l'emplacement où le se trouve dans ce fichier. Il estpossible de le déplacer.• Lorsque l'on lit un ou plusieurs caractères avec une des fonctions de lecture,le curseur de lecture se déplace après les caractères lus.
Page 44 : Déplacement dans un fichier : déplacement par la lectureFILE fichier = NULL;fichier = fopen"test.txt", "r";char c1, c2, c3;c1 = fgetcfichier; // c1 = 'a'c2 = fgetcfichier;c3 = fgetcfichier;abcdtest.txtDéplacement du curseur de 1 caractère• Comme lorsque l'on ouvre "normalement" un fichier, un curseur ou têtes de lecture/écriture indique l'emplacement où le se trouve dans ce fichier. Il estpossible de le déplacer.• Lorsque l'on lit un ou plusieurs caractères avec une des fonctions de lecture,le curseur de lecture se déplace après les caractères lus.
Page 45 : Déplacement dans un fichier : déplacement par la lectureFILE fichier = NULL;fichier = fopen"test.txt", "r";char c1, c2, c3;c1 = fgetcfichier; // c1 = 'a'c2 = fgetcfichier; // c2 = 'b'c3 = fgetcfichier;abcdtest.txtDéplacement du curseur de 1 caractère• Comme lorsque l'on ouvre "normalement" un fichier, un curseur ou têtes de lecture/écriture indique l'emplacement où le se trouve dans ce fichier. Il estpossible de le déplacer.• Lorsque l'on lit un ou plusieurs caractères avec une des fonctions de lecture,le curseur de lecture se déplace après les caractères lus.
Page 46 : Déplacement dans un fichier : déplacement par la lectureFILE fichier = NULL;fichier = fopen"test.txt", "r";char c1, c2, c3;c1 = fgetcfichier; // c1 = 'a'c2 = fgetcfichier; // c2 = 'b'c3 = fgetcfichier; // c3 = 'c'abcdtest.txtDéplacement du curseur de 1 caractère• Comme lorsque l'on ouvre "normalement" un fichier, un curseur ou têtes de lecture/écriture indique l'emplacement où le se trouve dans ce fichier. Il estpossible de le déplacer.• Lorsque l'on lit un ou plusieurs caractères avec une des fonctions de lecture,le curseur de lecture se déplace après les caractères lus.
Page 47 : Déplacement dans un fichier : lecture• Pour récupérer l'ensemble des caractères d'un fichier, on lit le fichier jusqu'àarriver à la fin du fichier qui sera connue en regardant le retour de la fonctionde lecture : elle retourne la valeur EOFint mainFILE fichier = NULL;int caractereActuel = EOF+1;fichier = fopen"test.txt", "r";if fichier != NULL// Boucle de lecture des caractères un à unwhile caractereActuel != EOFcaractereActuel = fgetcfichier; // On lit le caractèreprintf"c", caractereActuel;// On l'affiche ; // On continue tant que fgetc n'a pas retourné EOF// et on ferme l'accès au fichierfclosefichier;
Page 48 : Déplacement dans un fichier : retour au début• Il existe des fonctions spécifiques pour déplacer le curseur dans un fichier.• La procedure rewind remet le curseur au début du fichiervoid rewind FILE flux;int mainFILE fichier = NULL;int caractereActuel = 0;fichier = fopen"test.txt", "r";if fichier != NULL// Boucle de lecture des caractères un à undocaractereActuel = fgetcfichier; while caractereActuel != EOF;rewind fichier; // retour du curseur au début
Page 49 : Déplacement dans un fichier : retour au début• Exemple d'utilisation: compter le nombre de caractères d'un fichier pour déclarer un tableau de la bonne taille contenant ces caractères:FILE fichier = NULL;fichier = fopen"test.txt", "r";char texte;int nmbCaractere=0;if fichier == NULLexit1;whilefgetcfichier!=EOFnmbCaractere++; // retour du curseur au débutrewind fichier;// tableau de taille nmbCaracteretexte=mallocnmbCaracteresizeofchar+1;// parcours du fichierforint i=0; inmbCaractere; i++textei=fgetcfichier;textenmbCaractere = '\0'fclosefichier;Rmq : ici on ajoute manuellement le caractère '\0'
Page 50 : Déplacement dans un fichier : fonction• Il existe des fonctions specifiques pour déplacer le curseur dans un fichier.• La fonction ftell retourne la position du curseur numéro de caractère dépendant de l'encodage pour les ouvertures en mode texte,etnuméro d'octet pour fichier binaire• La position du début de fichier vaut 0.• Pour le retour de ftell suivant l'encodage du fichier, il n'aura de sens que pour la fonction inverse fseek. Pour de l'ascii, cela correspondra au nombre de caractères codés sur 1 octetlong ftellFILE pointeurSurFichier;FILE fichier = fopen"texte.txt","r+";printf"ld ",ftellfichier;fgetcfichier;printf"ld ",ftellfichier;fgetcfichier;printf"ld ",ftellfichier;affiche : "0 1 2"
Page 51 : Déplacement dans un fichier : fonction• Il existe des fonctions specifiques pour déplacer le curseur dans un fichier.• La fonction fseek permet de deplacer le curseur d'un certain nombre de caractères / octets à partir de la position origine.• Les modes de déplacements :• modeDeplacement = 0 : on se déplace depuis le début du fichier. deplacement doit être positif SEEKSET• modedeplacement = 1 : on se déplace depuis la position actuelle. deplacement peut être positif ou negatif. SEEKCUR• modeDeplacement = 2 : on se déplace depuis la fin du fichier.deplacement doit être negatif. SEEKEND• Retourne 0 si tout se passe bien, une valeur non-nulle sinon rappel : voir la variable globale errno pour le détail de l'erreur.int fseekFILE flux, long deplacement, int modeDeplacement;
Page 52 : Déplacement dans un fichier : fonctionint fseekFILE flux, long deplacement, int modeDeplacement;FILE fichier = fopen"texte.txt","r+";fseekfichier, 4, SEEKSET;printf"c",fgetcfichier;Tu es un sorcier Harrytexte.txtLe caractère 's' est affiché• Il existe des fonctions specifiques pour déplacer le curseur dans un fichier.• La fonction fseek permet de deplacer le curseur d'un certain nombre de caractères / octets à partir de la position origine.•Exemple : qu'affiche le code suivant ?
Page 53 : Déplacement dans un fichier : fonctionint fseekFILE flux, long deplacement, int modeDeplacement;FILE fichier = fopen"texte.txt","r+";fgetcfichier;fgetcfichier;fseekfichier, 4, SEEKCUR;printf"c",fgetcfichier;Tu es un sorcier Harrytexte.txtLe caractère ‘u' est affiché• Il existe des fonctions specifiques pour déplacer le curseur dans un fichier.• La fonction fseek permet de deplacer le curseur d'un certain nombre de caractères / octets à partir de la position origine.•Exemple : qu'affiche le code suivant ?
Page 54 : Déplacement dans un fichier : fonctionint fseekFILE flux, long deplacement, int modeDeplacement;FILE fichier = fopen"texte.txt","r+";fgetcfichier;fgetcfichier;fseekfichier, 4, SEEKSET;printf"c",fgetcfichier;Tu es un sorcier Harrytexte.txtLe caractère 's' est affiché• Il existe des fonctions specifiques pour déplacer le curseur dans un fichier.• La fonction fseek permet de deplacer le curseur d'un certain nombre de caractères / octets à partir de la position origine.•Exemple : qu'affiche le code suivant ?
Page 55 : Déplacement dans un fichier : fonctionint fseekFILE flux, long deplacement, int modeDeplacement;FILE fichier = fopen"texte.txt","r+";fgetcfichier;fgetcfichier;fseekfichier, -4, SEEKEND;printf"c",fgetcfichier;Tu es un sorcier Harrytexte.txtLe caractère 'a' est affiché• Il existe des fonctions specifiques pour déplacer le curseur dans un fichier.• La fonction fseek permet de deplacer le curseur d'un certain nombre de caractères / octets à partir de la position origine.•Exemple : qu'affiche le code suivant ?
Page 56 : Entrées / Sorties : des fichiers aussi ?• Il existe des pointeurs de structures FILE qui sont déjà définies et accessiblesglobalement : ce sont celles des entrées et sorties standards•stdin : entrée standard terminal•stdout : sortie standard terminal•stderr : erreur standard terminal•Partout où vous pouvez utiliser une variable de type FILE, vous pouvez utiliserles pointeurs définis ci-dessus pour lire/écrire comme si ils étaient des fichiersphysiques d'ailleurs sous UNIX tout est considéré comme fichier•Vous pouvez donc facilement créer un exécutable qui va lire sur l'entréestandard ou écrire sur l'une des deux sorties•Attention au fait que ce ne sont pas de vrais fichiers physiques, il est doncimpossible d'utiliser fseek pour revenir au début puisque ce sont de véritablesflux continus
Page 57 : Conclusion et résumé•Il est possible de récupérer/enregistrer des données depuis/dans des fichiers depuis un programme C.•Cela permet, entre autres, de sauvegarder des résultats ou de traiter des données stockées sur l'ordinateur.•La structure FILE permet de gérer les flux de fichiers indépendamment du système.•Il faut distinguer les fichiers ASCII contenant du texte et les fichiers binaires, leur utilisation est différente•Il existe de nombreuses fonctions pour lire/écrire/gérer des fichiers. Nous avons vu les principales, mais d'autres existent ! Consulter la documentation officielle pour plus d'informations.•Les entrée / sortie / erreur standards sont vus comme des fichiers et peuvent être manipulés comme n'importe quel fichier physique à l'aide des mêmes fonctions
Pages : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57