Post

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 1

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 2

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 3

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 4

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 5

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 6

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 7

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 8

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 9

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 10

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 11

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 12

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 13

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 14

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 15

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 16

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 17

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 18

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 19

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 20

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 21

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 22

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 23

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 24

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 25

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 26

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 27

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 28

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 29

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 30

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 31

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 32

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 33

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 34

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 35

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 36

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 37

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 38

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 39

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 40

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 41

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 42

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 43

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 44

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 45

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 46

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 47

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 48

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 49

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 50

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 51

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 52

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 53

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 54

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 55

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 56

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

page 57

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

Le contenu de cet article est la propriété exclusive de son auteur.