Informatique 2 A 2009 -2010 Langage C 4ème séance
Objectifs de la séance 4 Lecture/écriture dans des fichiers
Fichiers • Un programme a en général besoin : - De lire des données (texte, nombres, images, …) - De sauvegarder des résultats (texte, nombres, images, …) Cela se fait en lisant et en écrivant dans des fichiers • Pour manipuler un fichier, on utilise un pointeur : FILE *fichier est appelé « flot de données » (dataflow). • Ouverture d’un fichier: FILE *fopen (char *nom, char *mode) Cette fonction renvoie un pointeur sur le fichier ouvert Exemple : fichier = fopen(“C: /Data/fichier 1. txt”, ”r”);
Fichiers FILE *fopen (char *nom, char *mode) • nom est une chaîne de caractères (tableau de caractères) contenant le nom du fichier ou bien un flot de données standard (stdin, …) • mode désigne le type de traitement du flot de données - “r” (read) : lecture - “w” (write) : écriture (le fichier est écrasé s’il existe) - “a” (append) : dans un fichier existant (à la fin) • Fermeture d’un fichier: int fclose (FILE *fichier) Exemple : fclose(fichier); Il faut toujours fermer un fichier après l’avoir utilisé !
Fonctions de lecture / écriture • Ecriture : Exemple : fprintf(FILE *fichier, char *proto, …); double a; fprintf(fichier, «Var = %lfn» , a); Même syntaxe que printf ! printf( «Var = %lfn» , a); • Lecture : Exemple : fscanf(FILE *fichier, char *proto, …); double a; fscanf(fichier, «Var = %lf» , &a); Même syntaxe que scanf ! scanf( «Var = %lf» , &a);
Exemple - Ecriture include void main() { double a, b; FILE *fichier; a=1. 5; b=2. 5; // Ouverture du fichier en ecriture fichier = fopen("C: /goudail/fichier. txt", "w"); // Verifier que le fichier a bien été ouvert if (fichier != NULL) { // Ecriture fprintf(fichier, "%lfn", a); fprintf(fichier, "%lfn", b); // Fermeture du fichier fclose(fichier); } return; }
Exemple - Lecture #include void main() { int i; double tab[2], *p; FILE *fichier; // Ouverture du fichier en lecture fichier = fopen("C: /goudail/fichier. txt", "r"); if (fichier != NULL) { p=tab; // Initialisation du pointeur p for(i=0; i<2; i++) fscanf(fichier, "%lf", p++); fclose(fichier); } for(i=0; i<2; i++) printf("%lfn", tab[i]); return; }
Formats de fichiers • Les fichiers précédents ont été écrits au format « texte » -> on a utilisé les fonctions fprintf et fscanf -> le code ASCII de chaque caractère est écrit dans le fichier • Lorsqu’on a des données numériques, il est souvent plus efficace de les écrire sous forme « binaire » . • Soit un nombre 1. 345643355454 E-18 • Au format double, il occupe 8 octets • Au format ASCII, il occupe 18 octets (1 octet par caractère) • Ecriture d’un bloc de données en binaire Les données sont repérées par un pointeur int fwrite(void *source, int taille_type, int nombre, FILE *flot) • Lecture d’un bloc de données en binaire int fread(void *dest, int taille_type, int nombre, FILE *flot)
Exemple – Fichier binaire #define DIM 10000 void main() { int i; double sum, tab 1[DIM], tab 2[DIM]; FILE *fichier; // Remplissage du tableau for(i=0; i