Informatique 2A 2009-2010 Langage C 4ème séance
Objectifs de la séance 4 Lecture/écriture dans des fichiers
Cela se fait en lisant et en écrivant dans des 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 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/fichier1.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 fprintf(FILE *fichier,char *proto,…); Exemple : double a; fprintf(fichier,«Var = %lf\n»,a); Même syntaxe que printf ! printf(«Var = %lf\n»,a); Lecture : fscanf(FILE *fichier,char *proto,…); Exemple : double a; fscanf(fichier,«Var = %lf»,&a); Même syntaxe que scanf ! scanf(«Var = %lf»,&a);
Exemple - Ecriture include <stdio.h> 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,"%lf\n",a); fprintf(fichier,"%lf\n",b); // Fermeture du fichier fclose(fichier); } return; }
Exemple - Lecture #include <stdio.h> 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("%lf\n",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.345643355454E-18 Au format double, il occupe 8 octets Au format ASCII, il occupe 18 octets (1 octet par caractère) Les données sont repérées par un pointeur Ecriture d’un bloc de données en binaire 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,tab1[DIM],tab2[DIM]; FILE *fichier; // Remplissage du tableau for(i=0;i<DIM;i++) tab1[i]=i*atan(1); // Ecriture du fichier au format binaire fichier = fopen("C:/goudail/fichier.bin","wb"); if (fichier != NULL) fwrite(tab1,sizeof(double),DIM,fichier); fclose(fichier); } // Lecture du fichier fichier = fopen("C:/goudail/fichier.bin","rb"); fread(tab2,sizeof(double),DIM,fichier); fclose(fichier); return;