Synthèse des entrées-sorties en langage C Michel VINCIGUERRA Ouverture et ferme

Synthèse des entrées-sorties en langage C Michel VINCIGUERRA Ouverture et fermeture de fichiers (Ansi c) Ouverture d’un fichier : fopen Lorsqu’on désire accéder à un fichier, il est nécessaire avant tout accès d’ouvrir le fichier à l’aide de la fonction fopen. Utilisation fopen (nom-de-fichier, mode) Sémantique des paramètres nom-de-fichier est de type pointeur vers char. La chaîne pointée est le nom du fichier auquel on veut accéder. - mode est de type pointeur vers char. La chaîne pointée indique le mode d’ouverture, elle peut être l’une des chaînes suivantes :  [ »r »] ouverture d’un fichier texte en lecture.  [ »w »] ouverture d’un fichier texte en écriture.  [ »a »] ouverture d’un fichier texte en écriture à la fin.  [ »rb »] ouverture d’un fichier binaire en lecture.  [ »wb »] ouverture d’un fichier binaire en écriture.  [ »ab »] ouverture d’un fichier binaire en écriture à la fin.  [ »r+ »] ouverture d’un fichier texte en lecture/écriture.  [ »w+ »] ouverture d’un fichier texte en lecture/écriture.  [ »a+ »] ouverture d’un fichier texte en lecture/écriture à la fin.  [ »r+b » ou « rb+] ouverture d’un fichier binaire en lecture/écriture.  [ »w+b » ou « wb+] ouverture d’un fichier binaire en lecture/écriture.  [ »a+b » ou « ab+] ouverture d’un fichier binaire en lecture/écriture à la fin. Remarque : La fonction fopen a été normalisée en ayant présent à l’esprit que certains systèmes font la distinction entre fichiers binaires et fichiers textes. Cette distinction n’a pas cours dans le système UNIX. Valeur rendue La fonction fopen retourne une valeur de type pointeur vers FILE, où FILE est un type prédéfini dans le fichier stdio.h. - Si l’ouverture a réussi, la valeur retournée permet de repérer le fichier, et devra être passée en paramètre à toutes les procédures d’entrées-sorties sur le fichier. - Si l’ouverture s’est avérée impossible, fopen rend la valeur NULL. Conditions particulières et cas d’erreur Si le mode contient la lettre r, le fichier doit exister, sinon c’est une erreur. - Si le mode contient la lettre w, le fichier peut, ou peut ne pas, exister. Si le fichier n’existe pas, il est créé ; si le fichier existe déjà, son ancien contenu est perdu. - Si le mode contient la lettre a, le fichier peut, ou peut ne pas, exister. Si le fichier n’existe pas, il est créé ; si le fichier existe déjà, son ancien contenu est conservé. - Si un fichier est ouvert en mode << écriture à la fin >>, toutes les écritures se font à l’endroit qui est la fin du fichier au moment de l’exécution de l’ordre d’écriture. Cela signifie que si plusieurs processus partagent le même FILE *, résultat de l’ouverture d’un fichier en écriture à la fin, leurs écritures ne s’écraseront pas mutuellement. D’autre part, si un processus ouvre un fichier en écriture à la fin, fait un fseek pour se positionner à un endroit du fichier, puis fait une écriture, celle-ci aura lieu à la fin du fichier (pas nécessairement à l’endroit du fseek). Les voies de communication standard Quand un programme est lancé par le système, celui-ci ouvre trois fichiers correspondant aux trois voies de communication standard : standard input, standard output et standard error. Il y a trois constantes prédéfinies dans stdio.h de type pointeur vers FILE qui repèrent ces trois fichiers. Elles ont pour nom respectivement stdin, stdout et stderr. Utilisation typique de fopen #include <stdio.h> FILE *fp; if ((fp = fopen(“donnees”,”r”)) == NULL) { fprintf(stderr, »Impossible d’ouvrir le fichier données en lecture\n »); exit(1); } Fermeture d’un fichier : fclose Quand on a terminé les E/S sur un fichier, il faut en informer le système à l’aide de la fonction fclose. Utilisation fclose (flot-de-données) Sémantique des paramètres flot-de-données est de type pointeur vers FILE. Il pointe vers le fichier à fermer. Valeur rendue La fonction fclose rend la valeur zéro si le fichier a été fermé, et rend EOF s’il y a eu une erreur. Utilisation typique #include <stdio.h> FILE *f; Fclose(f); Lecture et écriture par caractère sur fichier Lecture par caractère : fgetc Utilisation fgetc (flot-de-données) Sémantique des paramètres - flot-de-données est de type pointeur vers FILE. Il pointe vers le fichier à partir duquel se fait la lecture. Description La fonction fgetc lit un caractère du fichier flot-de-données. Valeur rendue Si la lecture se fait sans erreur et sans rencontre de la fin de fichier, fgetc rend le caractère lu. S’il y a erreur d’entrée-sortie, ou rencontre de fin de fichier, fgetc rend la valeur EOF. Pour cette raison, le type de la valeur rendue est int et non pas char. Utilisation typique #include <stdio.h> int c; FILE *fi; while ((c = fgetc(fi)) != EOF) { ... /* utilisation de c */ } Lecture par caractère : getc Il existe une fonction getc qui est rigoureusement identique à fgetc (même interface, même sémantique), sauf que getc est implémenté comme une macro et non comme une vraie fonction C. La différence est que getc peut évaluer plusieurs fois son paramètre flot-de-données, ce qui lui interdit d’être une expression contenant des effets de bord. Exemple : int i; FILE * TAB_FILE[10]; c = getc(TAB_FILE[i++]); /* Arrgh..., effet de bord ! */ lecture par caractère : getchar Utilisation getchar ( ) Description La fonction getchar est rigoureusement équivalente à getc(stdin). C’est également une macro, mais comme elle n’admet pas de paramètre, elle n’a pas le (petit) inconvénient de getc. Ecriture par caractère : fputc Utilisation fputc (carac , flot-de-données) Sémantique des paramètres - carac est de type int, c’est le caractère à écrire. - flot-de-données est de type pointeur vers FILE. Il pointe vers le fichier sur lequel se fait l’écriture. Description La fonction fputc écrit le caractère carac dans le fichier flot-de-données. Valeur rendue La fonction fputc rend le caractère écrit si l’écriture s’est faite sans erreur, ou EOF en cas d’erreur. Utilisation typique #include <stdio.h> int c; FILE *fi,*fo; /* fi : résultat de fopen de fichier en lecture */ /* fo : résultat de fopen de fichier en écriture */ while ((c = fgetc(fi)) != EOF) fputc(c,fo); Lecture par caractère : putc Il existe une fonction putc qui est rigoureusement identique à fputc (même interface, même sémantique), sauf que putc est implémenté comme une macro et non comme une vraie fonction C. La même remarque que celle faite au sujet de getc s’applique donc à putc. Ecriture par caractère : putchar Utilisation putchar (carac) Description Un appel putchar© est rigoureusement identique à fputc(c,stdout). Lecture et écriture par lignes sur fichier Lecture par ligne : fgets Utilisation : fgets (chaîne , taille , flot-de-données) Sémantique des paramètres - chaîne est de type pointeur vers char et doit pointer vers un tableau de caractères. - taille est la taille en octets du tableau de caractères pointé par chaîne. - flot-de-données est de type pointeur vers FILE. Il pointe vers le fichier à partir duquel se fait la lecture. Valeur rendue La fonction fgets rend le pointeur chaîne cas de lecture sans erreur, ou NULL dans le cas de fin de fichier ou d’erreur. Attention : Sur fin de fichier ou erreur, fgets rend NULL et non pas EOF. Grrr ... Description La fonction fgets lit les caractères du fichier et les range dans le tableau pointé pa chaîne jusqu’à rencontre d’un line-feed (qui est mis dans le tableau), ou rencontre de fin de fichier, ou jusqu’à ce qu’il ne reste plus qu’un seul caractère libre dans le tableau. fgets complète alors les caractères lus par un caractère null. Utilisation typique #include <stdio.h> #define LONG ... char ligne[LONG]; FILE *fi; while (fgets(ligne,LONG,fi) != NULL) /* stop sur fin de fichier ou erreur */ { ... /* utilisation de ligne */ } Lecture par ligne : gets Utilisation : gets (chaîne) Sémantique des paramètres - chaîne est de type pointeur vers char et doit pointer vers un tableau de caractères. Valeur rendue fgets rend un pointeur vers le tableau de caractères en cas de lecture sans erreur, ou NULL dans le cas de fin de fichier ou d’erreur. Description La fonction gets est un fgets sur stdin. Malheureusement, l’interface de gets est une catastrophe : il n’a pas le paramètre taille qui donne la taille du tableau pointé par chaîne. Ceci interdit donc à gets toute vérification pour ne pas déborder du tableau. Pour cette raison l’usage de gets est très fortement déconseillé Ecriture par chaîne : fputs Utilisation : fputs (chaîne , flot-de-données) Sémantique des paramètres - chaîne est de type pointeur vers char. Pointe vers un tableau de caractères contenant une chaîne se terminant par un null. - flot-de-données est de type pointeur vers FILE. Il pointe vers le fichier sur lequel se fait l’écriture. Valeur rendue La fonction fputs rend une valeur non négative si l’écriture se passe sans erreur, et EOF en cas d’erreur. Description fputs écrit sur le fichier le contenu du tableau dont la fin est indiquée uploads/Litterature/ ouverture-et-fermeture-de-fichiers.pdf

  • 37
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager