Traitement de fichiers
Le fichier en-tête <stdio.h> contient les déclarations d'un ensemble de fonctions qui gèrent des fichiers ainsi que l'indispensable structure FILE et les constantes stdin et stdout. Dans la suite, FP désigne une source ou une destination de données qui est liée à un fichier sur disque dur ou sur un autre périphérique.
Principe: On associe une structure FILE au fichier par l'intermédiaire d'un pointeur sur cette structure.
FILE *fopen(const char *NOM_FICH, const char *MODE) 11.4.1.
fopen ouvre le fichier indiqué et fournit un pointeur sur FILE ou zéro en cas d'échec.
MODE est une des chaînes suivantes:
"r" (read) lecture seule, à partir du premier caractère du ficher
"w" (write) écriture après création ou écrasement du fichier, s'il existe déjà
int *fclose(FILE *FP) 11.4.2.
fclose écrit les données de FP qui n'ont pas encore été écrites, jette les données de la mémoire tampon qui n'ont pas encore été lues, libère l'espace pris par la mémoire tampon et ferme le fichier associé à FP. fclose retourne EOF en cas d'échec, sinon zéro.
int feof(FILE *FP) 11.5.3.
feof fournit une valeur différente zéro si FP est arrivé à la fin du fichier.
int fprintf(FILE *FP, const char *FORMAT, ...)
11.5.1.
fprintf convertit les données dans une suite de caractères et les écrit dans FP sous le contrôle de FORMAT. La valeur du résultat est le nombre de caractères écrits; le résultat est négatif dans le cas d'une erreur.
FORMAT contient deux sortes de données: des caractères qui sont copiés comme tels dans FP et des spécificateurs de format qui définissent la conversion du prochain paramètre de fprintf.
Spécificateurs de format pour fprintf
SYMBOLE
|
TYPE
|
IMPRESSION
COMME
|
%d
ou %i
|
int
|
entier
relatif
|
%u
|
int
|
entier
naturel (unsigned)
|
%o
|
int
|
entier
exprimé en octal
|
%x
ou %X
|
int
|
entier
exprimé en hexadécimal
|
%c
|
int
|
caractère
|
%f
|
double
|
rationnel
en notation décimale
|
float
|
rationnel
en notation décimale
| |
%e
|
double
|
rationnel
en notation scientifique
|
float
|
rationnel
en notation scientifique
| |
%s
|
char*
|
chaîne
de caractères
|
Pour traiter correctement les arguments du type long, il faut utiliser les spécificateurs %ld, %li, %lu, %lo, %lx.
Pour traiter correctement les arguments du type long double, il faut utiliser les spécificateurs %Lf et %Le.
int fscanf(FILE *FP, const char *FORMAT, ...) 11.5.1.
fscanf lit des données de FP sous le contrôle de FORMAT et les attribue aux arguments suivants qui doivent être des pointeurs. La fonction s'arrête si la chaîne de format a été travaillée jusqu'à la fin. La valeur du résultat est le nombre des données lues ou EOF au cas d'une erreur ou si on est arrivé à la fin du fichier.
FORMAT contient trois sortes de données: des caractères qui doivent être entrés exactement de la même façon qu'ils sont notés dans la chaîne FORMAT; des signes d'espacement qui correspondent à une suite quelconque de signes d'espacement lors de l'entrée; des spécificateurs de format qui définissent la conversion de la prochaine donnée.
Spécificateurs de format pour fscanf
SYMBOLE
|
LECTURE
D'UN(E)
|
TYPE
|
%d
ou %i
|
entier
relatif
|
int*
|
%u
|
entier
naturel (unsigned)
|
int*
|
%o
|
entier
exprimé en octal
|
int*
|
%x
|
entier
exprimé en hexadécimal
|
int*
|
%c
|
caractère
|
char*
|
%s
|
chaîne
de caractères
|
char*
|
%f
ou %e
|
rationnel
en notation décimale
|
float*
|
ou
exponentielle
|
Si nous voulons lire une donnée du type long, nous devons utiliser les spécificateurs %ld, %li, %lu, %lo, %lx.
Si nous voulons lire une donnée du type double, nous devons utiliser les spécificateurs %le ou %lf.
Si nous voulons lire une donnée du type long double, nous devons utiliser les spécificateurs %Le ou %Lf.
int fputc(int C, FILE *FP) 11.5.2.
fputc écrit le caractère C (converti en unsigned char) dans FP. La fonction retourne le caractère écrit comme résultat ou EOF lors d'une erreur.
int fgetc(FILE *FP) 11.5.2.
fgetc lit le prochain caractère de FP comme unsigned char (converti en int) ou EOF à la fin du fichier ou lors d'une erreur.
Lire et écrire dans les fichiers standard
int printf(const char *FORMAT, ...) 4.1. / 8.6.1.
printf(...) est équivalent à fprintf(stdout, ...).
int scanf(const char *FORMAT, ...) 4.2. / 8.6.1.
scanf(...) est équivalent à fscanf(stdin, ...).
int putchar(int C) 4.3.
putchar(C) est équivalent à fputc(C, stdout)
int getchar(void) 4.4.
getchar est équivalent à fgetc(stdin). (Comme le fichier stdin travaille à l'aide d'une mémoire tampon qui est évaluée ligne par ligne, getchar attend un retour à la ligne avant de fournir le caractère lu comme résultat.)
int puts(const char *CH) 8.6.1.
puts écrit la chaîne CH et un retour à la ligne dans stdout. La fonction retourne EOF lors d'une erreur sinon une valeur non négative.
char *gets(char *CH) 8.6.1.
gets lit la prochaine ligne de stdin et l'attribue à CH en remplaçant le retour à la ligne final par un symbole de fin de chaîne '\0'. La fonction retourne CH ou le pointeur nul à la fin du fichier ou lors d'une erreur.