Langage C :
Les fichiers
[email protected]
Les entrées-sorties standards
Trois pointeurs de flots standards existants au démarrage d’un
processus (programme en exécution)
stdin : flot standard d’entrée (clavier)
stdout : flot standard de sortie (écran)
stderr : flot standard d’erreur (écran)
Fermés automatiquement à la terminaison du processus
Les flots standards ne permet pas de stocker des données, ou
d’exploiter des données déjà existantes.
Le langage C offre la possibilité de lire et d’écrire des données dans
un fichier (utiliser d’autres flots)
Manipulation des fichiers
Fonctions de haut niveau : (opérations)
Fonction d’ouverture d’un fichier : « fopen »
Prend un chemin dans le système de fichiers et renvoie un pointeur de
type File sur le fichier
Fonctions de lecture, d’écriture et de positionnement :
« fscanf/fread », « fprintf/fwrite », « fseek » Utilsant le pointeur
Fonction de fermeture : « fclose »
Clôt le fichier
Fonction fopen()
Ouverture d’un fichier : fopen(″chemin″, ″mode ″);
Mode : spécifie le mode d’accès au fichier. Les spécificateurs de
mode d’accès diffèrent suivant le type de fichier considéré.
On distingue
Les fichiers textes, pour lesquels les caractères de contrôle (retour à la
ligne . . . ) seront interprétés en tant que tels lors de la lecture et de
l’écriture
Les fichiers binaires, pour lesquels les caractères de contrôle se sont
pas interprétés.
Fonction fopen()
Les différents modes d’accès sont les suivants:
Fonction fopen()
Ces modes d’accès ont pour particularités :
Si le mode contient la lettre r, le fichier doit exister.
Si le mode contient la lettre w, le fichier peut ne pas exister. Dans ce
cas, il sera créé. Si le fichier existe déjà a, son ancien contenu sera
perdu.
Si le mode contient la lettre a, le fichier peut ne pas exister. Dans ce
cas, il sera créé. Si le fichier existe déjà, les nouvelles données seront
ajoutées `a la fin du fichier précédent.
Fonction fopen()
La fonction fopen renvoie un pointeur sur une structure de type FILE
FILE * f_IN;
f_IN = fopen(″chemin″, ″mode ″);
Si l’ouverture a réussi, la valeur retournée permet de repérer le fichier
Si l’ouverture s’est échoué, fopen rend la valeur NULL
Penser à tester la valeur de retour de la fonction fopen
if((f_IN = fopen(″monFichier.txt″, ″r+″)) == NULL) {
printf(″Impossible d’ouvrir le fichier \n″);
}
Fonction fclose()
Sert a fermer le flot associé au pointeur
FILE * f_IN = fopen(″monFichier.txt″, ″r+″);
/* Opérations sur le fichier */
fclose(f_IN);
Elle retourne 0 en cas de succès, -1 sinon
Toujours fermer un flot dès que l’on peut
Toujours ne le fermer qu’une seule fois
Fonctions fgetc() et fputc()
fgetc(FILE *f_IN) :
Permet de lire un caractère depuis le flot;
Retourne un entier représentant le caractère ou le EOF
fputc(int c, FILE *f_OUT) : permet d’écrire le caractère c sur le flot
Exercice :
Écrire un programme permettant de lire le contenu d’un fichier
« fichier1.txt » et le copier caractère par caractère dans le fichier
« fichier2.txt »
Fonctions fgetc() et fputc()
Solution :
Fonctions fgets() et fputs()
fgets(char *ptr_s, int taille, FILE *f_IN)
Permet de lire une chaîne de caractère depuis le flot
Ptr_s : une chaîne qui compte au maximum taille
F_IN : pointeur vers le fichier
fputs(char *ptr_s, FILE *f_OUT)
Permet d’écrire la chaîne de caractère ptr_s dans le flot
Fonctions fscanf() et fprintf()
fprintf(f_IN,"format",expression-1, ..., expression-n)
La fonction fprintf, analogue à printf, permet d’écrire des données dans
un fichier
Elle retourne le nombre de caractère écrits ou une valeur négative
fscanf(f_OUT,"format",argument-1,...,argument-n)
La fonction fscanf, analogue à scanf, permet de lire des données dans
un fichier
Retourne 1 si la lecture est réussie, 1- sinon
Utiliser feof et ferror pour tester la fin du fichier ou une erreur
d’entrée-sortie
Exemple : copier un fichiers d’entiers
Les entrées-sorties binaires
Les fonctions d’entrées-sorties binaires permettent de transférer des
blocs de données dans un fichier sans transcodage. Elles sont donc
plus efficaces que les fonctions d’entrée-sortie standard, mais les
fichiers produits ne sont pas portables puisque le codage des
données dépend des machines.
Elles sont notamment utiles pour manipuler des données de grande
taille ou ayant un type composé. Leurs syntaxes sont :
int fread(void *pointeur, int taille, int nombre, FILE *flot);
int fwrite(void *pointeur, int taille, int nombre, FILE *flot);
où pointeur est l’adresse du début des données à transférer, taille la
taille des objets à transférer, nombre leur nombre.
Fonctions fread, fwrite et ffluch
fread(ptr, taille, nbr, f_IN)
retourne le nombre de caractère écrits ou une valeur négative
fwrite(ptr, taille, nbr, f_OUT)
Personne *pers;
int nbrePers;
FILE *f_IN;
…..
if(fwrite(pers, sizeof(Personne), nbrePers, f_IN) < nbrePers) {
printf("Impossible de sauvegarder le vecteur \n");
fclose(f_IN);
}
La fonction ffluch permet de forcer le vidage de la mémoire tampon
associée à un flot en sortie/entrée
int ffluch(FILE *flot);
Repositionnement du pointeur dans un ficher
ftell(FILE *flot) : retourne la position courante dans un fichier
fseek : permet de se positionner dans un fichier
rewind(FILE *flot) : permet de se positionner au début d’un fichier
fseek(FILE *flot, long déplacement, int origine);
La variable déplacement détermine la nouvelle position dans le fichier.
Il s’agit d’un déplacement relatif par rapport à l’origine ; il est compté
en nombre d’octets. La variable origine peut prendre trois valeurs :
SEEK SET (égale à 0) : début du fichier ;
SEEK CUR (égale à 1) : position courante ;
SEEK END (égale `a 2) : fin du fichier.
TD sur les fichiers
A/ Écrire un programme qui calcule le nombre de lettre, de chiffres, de
ligne d’un fichier
B/ Ecrire un programme qui affiche les consones d’un fichier texte
C/ Écrire un programme permettant de recopier le contenu d’un fichier
à l’envers. On considère que le fichier contient que des mots construits
par des lettres alphabet
D/ Écrire un programme analysant un fichier texte et indiquant le
nombre d’occurrences de caractères et de chiffres dans le fichier
Correction : A (statistique d’un fichier)
Correction : B (Consones dans un fichier)
Correction : C (Convertisseur du fichier )
Version 1 (sans récursivité)
Correction : C (Convertisseur du fichier )
Version 2 (sans récursivité)