Les entrées-sorties : stdio.h

Les entrées-sorties : stdio.h

Ce fichier contient tout ce qui est nécessaire aux entrées-sorties. Il est quasiment toujours inclus dans les programmes en C.
Il contient les fonctions nécessaires :

FILE

A une variable de type FILE correspond une zone mémoire destinée à inscrire tout ce qui est nécessaire à la gestion d'un fichier utilisé par un programme pour des lectures ou (et) des écritures. Entre autres, seront notées dans cette zone : FILE * est le type "adresse d'un FILE".

fclose

La fonction :

int fclose(FILE * fichier)
effectue la "fermeture" du fichier indiqué. Elle ressemble à l'instruction free puisqu'elle libère l'espace mémoire qui avait été alloué pour la gestion de ce fichier.
Il faut fermer tous les fichiers qui ont été ouverts. Si cela n'est pas fait, certains accidents peuvent se produire. Par exemple, s'il s'agit d'un fichier d'écriture, le contenu du tampon (où on range les données à écrire jusqu'à ce que celui-ci soit plein) risque de ne pas être reporté dans le fichier : il manquerait alors la fin des données que l'on attend en sortie.
La fonction retourne EOF en cas d'erreur, 0 sinon.

fgetc

La fonction :
int getc(FILE * fichier)
getc() retourne le caractère suivant lit dans le flot indiqué par le paramètre fichier ; si la fin de fichier est atteinte, elle retourne EOF.

fgets

Grosso modo, cette fonction sert à lire une ligne de fichier, sans dépasser un nombre maximum de caractères.
Si chaine est un tableau de caractères, n un entier et Fichier un fichier de lecture de données, l'instruction :
fgets(chaine, n, fichier)
lit dans Fichier, caractère par caractère à partir de la position courante, jusqu'à :
  • soit rencontrer le caractère de fin de ligne '\n'
  • soit que le nombre de caractères lus soit égal à n - 1.
    Les caractères lus sont copiés dans chaine, y compris le caractère de fin de ligne si celui-ci fait partie des au plus n-1 caractères lus. La fonction fgets complète la chaîne par le traditionnel '\0'.

    Exemples : si n vaut 4 et que, à partir de la position courante dans Fichier, on trouve ou\n, chaine contiendra ou\n\0. Si dans le fichier il y a oui\n, chaine contiendra oui\0 et s'il y a bien\n, chaine contiendra bie\0.

    fopen

    La fonction :

    FILE * fopen(const char * nomFichier, const char * mode)
    présente une similitude avec un "malloc". Lorsqu'elle est rencontrée, une zone mémoire est allouée pour une variable de type
    FILE ; la fonction fopen retourne l'adresse de cette zone. Les deux paramètres de la fonction fopen indique :
  • pour le premier, l'adresse physique du fichier correspondant
  • pour le second paramètre, le type d'accès souhaité et le type du fichier :
    • "r" comme "read" : le fichier est un fichier texte ouvert en mode lecture. Si aucun fichier physique ne possède le nom nomFichier, fopen retourne alors NULL.
    • "w" comme write. Un fichier texte sera ouvert en mode écriture, et portera le nom nomFichier ; si un fichier de nom nomFichier existait, celui-ci est écrasé. le type d'accès est donc ici un type d'accès en lecture.
    • "a" comme "add" ; un fichier de nom nomFichier est ouvert ou créé en mode écriture ; le début des écritures se fera à la fin du fuichier ouvert.
    • "r+", ouverture en mode mise à jour pour un fichier de type texte : lecture et écriture seront possibles. Il est nécessaire que le fichier physique existe avant l'appel de fopen. Le positionnement initial dans le fichier ouvert est au début du fichier.
    • "w+" : création d'un fichier texte en mode mise à jour.
    • "a+" : ouverture ou créationn d'un fichier texte et positionnement à la fin du fichier ouvert.
    Si on ajoute un b (comme par exemple "r+b"), il s'agit alors d'un fichier binaire.

    La variable contenant l'adresse retournée par la fonction fopen sera appelée "nom interne du fichier".

    fprintf

    La fonction :
    int fprintf(FILE * fichier, const char * format, ...)
    est l'équivalent dela fonction printf dans le cas où le fichier de sortie n'est plus le fichier standard.
    Il suffit de l'utiliser comme la fonction printf en ajoutant, en premier paramètre, le nom interne du fichier de sortie.
    La fonction retourne le nombre de caractères écrits, ou bien, en cas d'erreur, un entier négatif.

    fscanf

    La fonction :
    int fscanf(FILE * fichier, const char * format, ...)
    ressemble beaucoup à la fonction scanf mais est appelée lorsque le fichier de lecture n'est pas le fichier d'entrée standard. On l'utilise de la même façon que la fonction scanf sauf que l'on doit ajouter le nom interne du fichier de lecture en premier paramètre.

    Lorsqu'on utilise un fichier, on peut imaginer qu'un curseur est positionné au fur et à mesure dans ce fichier. Avec le mode "r", le curseur est positionné à l'ouverture au début du fichier. Si on veut lire un entier, le curseur passe les espaces s'il y en a, lit les caractères jusqu'à rencontrer le prochain espace sur lequel il restera positionné jusqu'à la prochaine demande de lecture. L'ensemble des caractères lus est converti en un entier.

    La fonction fscanf retourne EOF si la fin de fichier est atteinte ou si une erreur se produit avant toute conversion ; sinon, elle retourne le nombre d'octets convertis et affectés.

    fseek

    La fonction
    int fseek(FILE *fichier, long offset, int origine)
    permet de se positionner dans le fichier indiqué.

     

    formats d'impression

    Si on désire écrire du texte et les valeurs d'un certain nombre de variables à l'aide de la fonction "printf" de la bibliothèque standard "stdio.h", la chaîne de caractères du printf va contenir, à la place où l'on désire voir insérée une valeur d'une variable, non pas le nom de cette variable mais ce qu'on appelle un "indicateur de format" de la variable en question. Ce format s'écrit sous la forme d'un % suivi d'une lettre représentant le type de la variable à écrire :
    %d pour un entier signé
    %u pour un entier non signé
    %c pour un caractère (type char)
    %s pour une chaîne de caractères

    getc

    La fonction :
    int getc(FILE * fichier)
    retourne le caractère suivant lu dans le flot indiqué par le paramètre fichier ; si la fin de fichier est atteinte, elle retourne EOF.
    Cette fonction à le même comportement que la fonction fgetc, mais est définie par une
    macro.

    getchar

    La fonction :
    int getchar()
    effectue
    getc(stdin).

    gets

    La fonction :
    int gets(char * chaine)
    lit la ligne suivante à partir de l'entrée standard et la place dans le tableau chaine ; elle remplace le caractère de fin de ligne par '\o'. Elle retourne chaine, sauf si la fin du flot d'entrée est atteinte, auquel cas elle retourne NULL.

    printf

    La fonction :

    int printf(cons char * format, ...)
    sert à écrire sur ce qu'on appelle la sortie standard. Par défaut, c'est-à-dire en l'absence d'indication contraire, la sortie standard est l'écran. Le premier argument que l'on donne à la fonction printf est toujours une
    chaîne de caractères . Nous expliquons le fonctionnement de cette fonction à l'aide d'exemples.
    1. printf("bonjour");
      Lorsque cette instruction est rencontrée, la fonction printf est chargée d'écrire sur la sortie standard le mot bonjour.
      Donc résultat sur la sortie : bonjour
       
    2. printf("Qu'il est agreable d'ecrire un programme "
              "en C,\nlorsqu'on l'utilise \"proprement\".\n");

      Les guillemets en fin de ligne et en début de la ligne suivante permettent d'écrire une chaîne de caractères sur plusieurs lignes.
      Résultat sur la sortie :
      Qu'il est agreable d'ecrire un programme en C,
      lorsqu'on l'utilise "proprement".

       
    3. printf("%d",3);
      La fonction printf écrit aussi la chaîne de caractères "%d" mais elle remplace le groupe %d, appelé indicateur de format, par le premier paramètre situé après la virgule, c'est-à-dire le 3 ; le d de %d indique qu'il s'agit d'un entier.
      donc résultat sur la sortie : 3
       
    4. printf("%s mesure %d cm et pese %f kg", nom, hauteur, poids);
      On suppose ici que nom est une chaîne de caractères qui contient "David", que hauteur est une variable de type int qui vaut 178 et poids une variable de type float qui vaut 64.5. La fonction printf interprète la chaîne de caractères en écrivant tous les caractères ordinaires et en remplaçant les indicateurs de format par les valeurs ou les valeurs des variables qui se trouvent derrière la virgule, en respectant l'ordre : au premier % correspond la première valeur indiquée, au deuxième % la deuxième valeur indiquée et ainsi de suite.
      Donc résultat sur la sortie :
      David mesure 178 cm et pese 64.500000 kg
       
    5. printf("les valeurs sont \n%5d\n%5d\n%.3f\n", valeur1, valeur2, valeur3);
      où valeur1 et valeur2 sont deux variables de type int qui contiennent 3 et 125, et où valeur3 est une variable de type float contenant 7.54756 ; les indications numériques permettent de préciser la façon d'écrire les valeurs.
      %5d : écrire la valeur correspondante comme une variable de type int écrite sur 5 positions en occupant les positions à partir de la droite.
      %.3f : écrire la valeur correspondante comme une variable de type float avec 3 décimales, en arrondissant au plus près.
      Donc résultat sur la sortie :
      0000 3
      00 125
        7.548

      fputc

      La fonction :
      int fputc(int caractere, FILE * fichier)
      écrit caractere, convertit en unsigned char, dans fichier. Elle retourne aussi caractere, ou bien EOF en cas d'erreur.

      putc

      La fonction :
      int putc(int caractere, FILE * fichier)
      est identique à
      fputc, sauf qu'il s'agit d'une macro.

      putchar

      putchar(caractere) effectue putc(caractere, stdout).

      puts

      Si "chaine" est une chaîne de caractères, puts(chaine) écrit "chaine" sur stdout (c'est-à-dire, sauf instruction contraire, l'écran) et termine par un caractère de fin de ligne. La fonction retourne une valeur de type int qui vaut EOF en cas d'erreur et une valeur positive ou nulle sinon.

      fputs

      La fonction :
      int fputs(const char * chaine, FILE * fichier)
      écrit chaine dans le fichier. Elle retourne EOF en cas d'erreur et une valeur positive ou nulle sinon.

      scanf

      La fonction

      int scanf(const char * format, ...)
      sert à saisir des valeurs de variables à partir de l'entrée standard qui est, par défaut, fournie par le clavier.

      Considérons l'instruction :

      scanf("%d",&n);
      Il s'agit de lire la valeur de la variable n.
      La fonction scanf, pour saisir correctement une variable, doit connaître le type de la variable à saisir. Le fait que la variable n soit d'un type entier est indiqué sur notre exemple en premier paramètre de la fonction scanf, par la chaîne de caractères "%d" (d comme decimal). Cette chaîne s'appelle "l'indicateur de format" ; s'il s'agissait d'un autre type défini par le langage, le d serait remplacé par une autre lettre.
      Le second paramètre de la fonction scanf indique l'adresse de la variable à saisir ; s'il s'agit comme sur notre exemple de la variable n, cette adresse est notée &n. La fonction scanf "sait" ainsi où aller ranger en mémoire la valeur de la variable lue.

      Pour ceux qui connaissent les modes de passage des paramètres "par valeur" ou "par adresse" (comme en Pascal), signalons que le langage C n'utilise que le mode de passage par valeur ; donner à la fonction scanf un argument (par valeur) qui soit une adresse revient à faire un passage par adresse.

      La fonction fscanf retourne EOF si un caractère représentant une fin de fichier est rencontré ou si une erreur se produit avant toute conversion ; sinon, elle retourne le nombre d'octets convertis et affectés.

      sprintf

      La fonction

      int sprintf(const char * chaine, const char * format, ...)
      fonctionne comme la fonction
      fprintf, sauf que le texte est écrit dans la chaîne de caractères chaine au lieu d'être écrit dans un fichier, et qu'il est terminé par '\0'..

      sscanf

      La fonction

      int sscanf(const char * chaine, const char * format, ...)
      fonctionne comme la fonction
      fscanf, sauf que le texte est lu dans la chaîne de caractères chaine au lieu d'être lu dans un fichier.

      fclose

      La fonction

      int fclose(FILE * fichier)
      force l'écriture de données qui reste dans la mémoire-tampon du flot et ferme le fichier. Elle retourne zéro, sauf en cas d'erreur ou elle retourne EOF.

      fflush

      La fonction

      int fflush(FILE * fichier)
      effectue l'écriture des données mises en mémoire tampon, si fichier est un fichier de sortie. Dans le cas d'un fichier d'entrée, l'effet est imprévisible.