Vous êtes sur la page 1sur 2

Plan

Algorithmique et langage C
— I/O : file.h, ... —

1 FILE

CERI Numérique

Luc Fabresse
luc.fabresse@imt-lille-douai.fr
version 1.2
Luc Fabresse – Cours Algo&C 2

Manipulation de fichiers Principe de la manipulation de fichiers


Principe général
<stdio.h> 1 Ouvrir le fichier
De nombreuses fonctions pour la manipulation de fichiers 2 lire / écrire dans le fichier
Utilisent un "buffer" (bloc en mémoire) géré automatiquement 3 fermer le fichier
Aucune écriture physique sur le disque mais dans le buffer qui est écrit d’un coup #include <stdio.h>
quand il est plein ou qu’on le purge #include <stdlib.h>

int main(void){
Fonctions de <stdio.h> char fileName[] = "donnees.txt";
FILE* f;
le type FILE
f = fopen(fileName,"r");
FILE *fopen(char *name, char *mode). Différents modes :
"r" ouvre le fichier en lecture // traiter le contenu du fichier ici
"w" ouvre le fichier en écriture. S’il n’existe pas, il est créé. S’il existe, son contenu est
effacé. fclose(f);
"a" ouvre le fichier en écriture pour ajout (append). Conserve le contenu du fichier s’il return EXIT_SUCCESS;
existe. }
int fclose(FILE*) retourne 0 si ok et EOF sinon

Luc Fabresse – Cours Algo&C 3 Luc Fabresse – Cours Algo&C 4

Principe de la manipulation de fichiers Principe de la manipulation de fichiers avec gestion des erreurs
Principe général
#include <stdio.h>
1 Ouvrir le fichier #include <stdlib.h>
#include <errno.h>
2 lire / écrire dans le fichier
int main(void){
3 fermer le fichier char fileName[] = "donnees1.txt";
FILE* f;
#include <stdio.h>
#include <stdlib.h> f = fopen(fileName,"r");

int main(void){ if(f==NULL) {


char fileName[] = "donnees.txt"; printf ("Code de l'erreur : %d\n", errno);
FILE* f;
if (errno == ENOENT)
f = fopen(fileName,"r"); printf ("Le fichier n'existe pas !\n");
else
// traiter le contenu du fichier ici printf ("Erreur inconnue\n");

fclose(f); return EXIT_FAILURE;


}
return EXIT_SUCCESS;
} // traiter le contenu du fichier ici

fclose(f);
Attentions aux erreurs !
return EXIT_SUCCESS;
Toujours tester les codes d’erreurs }

Luc Fabresse – Cours Algo&C 4 Luc Fabresse – Cours Algo&C 5

Les fonctions de lecture Les fonctions d’écriture


Lecture formatées
int fscanf ( FILE * stream, const char * format, ... );
Ecritures formatées
Lecture par caractères int fprintf ( FILE * stream, const char * format, ... );
char fgetc(FILE *id) ou int getc(FILE *fp) retourne le prochain caractère du
fichier (EOF pour end of file) Par blocs, caractères, ...
int fwrite(void *bloc, int taille, int nb, FILE *id) : écriture du bloc
Lecture par chaînes sur fichier, si le nombre rendu est différent de nb, il y a eu erreur (tester ferror ou
char *fgets(char *line, int maxline, FILE *fp) : lit la prochaine ligne dans fp errno).
(dont le caractère \n) et place le contenu dans line. Au plus, maxline-1 caractères int putc(int c, FILE *fp) écrit c dans le fichier et retourne c ou EOF en cas
seront lus. La chaîne résultante sera automatique terminée par \0. Normalement, fgets d’erreur
retourne line et NULL en cas d’erreur ou fin de fichier.
Gestion du buffer système
Lecture par blocs
int fflush(FILE *id) : transfère effectivement le reste du buffer sur disque, sans
int fread(void *bloc, int taille, int nb, FILE *id) : lit nb éléments dont on fermer le fichier (à appeler par exemple avant une instruction qui risque de créer un
donne la taille unitaire en octets, dans le fichier désigné par id, le résultat étant stocké à "plantage").
l’adresse bloc. La fonction rend le nombre d’éléments lus (<nb si fin de fichier), 0 si erreur

Détecter la fin de fichier


int feof(FILE *id) indique si on est en fin de fichier ou non (0).
Luc Fabresse – Cours Algo&C 6 Luc Fabresse – Cours Algo&C 7
Se déplacer dans un fichier Exemple

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(void){ $ cat data.txt


char fileName[] = "data.txt"; 10
int fseek(FILE *id, long combien, int mode) FILE* f; -7
piklpilu
déplace le pointeur de fichier de combien octets, à partir de : début du fichier (mode=0), azdjhaoidhiopahdiohpodazljdbaz
if( (f=fopen(fileName,"r")) == NULL) {
position actuelle (mode=1) ou fin du fichier (mode=2). Retourne 0 si tout c’est bien printf ("Code de l'erreur : %d\n", errno); qvcwx$
passé. Cette fonction n’est utilisable que si l’on connaît la taille des données dans le return EXIT_FAILURE; }
fichier (impossible d’aller directement à une ligne donnée d’un texte si on ne connaît pas // traiter le contenu du fichier ici $ ./prog data.txt
la longueur de chaque ligne). char buffer[10]; >10
>-7
while( fgets(buffer,10,f) != NULL ) { >piklpilu
printf(">%s",buffer); >azdjhaoid hiopahdio hpodazljd baz
} >qvcwx$

fclose(f);
return EXIT_SUCCESS;
}

Luc Fabresse – Cours Algo&C 8 Luc Fabresse – Cours Algo&C 9