Fichiers binaires
1
En C, les communications d‟un programme avec son environnement se font
par l‟intermédiaire de fichiers.
Même le clavier et l‟écran sont des fichiers dits « standards ».
Nous pouvons donc créer, lire ou écrire dans des fichiers de différents
périphériques .
2
La gestion de fichiers en c est assurée par la librairie standard
<stdio.h> via un ensemble de fonctions commençant par la
lettre “f”
Déclaration :
FILE *f;
Un fichier f possède une position de début, une position de fin
et une position courante, stockés dans la structure de type FILE
Chaque opération sur un fichier est effectuée sur les données en position
courante.
Fichier séquentiel :
4
Les fichiers sont ouverts avec la fonction fopen
ils sont fermés avec la fonction fclose
FILE* fopen(const char* nomf, const char* mode);
int fclose (FILE *f);
Exemple :
FILE * pFichier = NULL;
pFichier = fopen(" C:\\MesDocuments\\Fiches.txt", "r");
déclarer un pointeur de type FILE * pour chaque fichier dont nous avons
besoin,
affecter l‟adresse retournée par fopen à ce pointeur,
employer le pointeur à la place du nom du fichier dans toutes les
instructions de lecture ou d‟écriture,
libérer la mémoire tampon et annuler la liaison entre le pointeur et le nom
du fichier à la fin du traitement à l‟aide de fclose :
int fclose(pFichier);
fclose retourne EOF si une erreur est survenue; 0 autrement.
Ouverture en écriture : les données non écrites de la mémoire tampon sont écrites.
Ouverture en lecture : les données non lues de la mémoire tampon sont perdues.
Si le fichier n'est pas ouvert correctement, inutile de continuer le
programme Testez systématiquement la valeur du descripteur de
fichier juste après fopen
void main()
{
char chaine[80];
int i;
int c;
// Création d'un fichier.
c = fgetc(pFichier);
while (c != EOF)
{
printf("%c", c);
c = fgetc(pFichier);
}
printf("\n");
fclose(pFichier); // Fermeture du fichier ouvert en lecture.
13
Opération d‟écriture : fputs
Écriture d‟une chaîne pointée par pChaine dans un fichier décrit par pFichier.
int fputs(char * pChaine, FILE * pFichier);
La copie s‟effectue jusqu‟à ce que l‟on rencontre le caractère '\0'.
Si l‟opération d‟écriture n‟est pas réussie, fputs retourne le caractère EOF.
14
#include <stdio.h>
void main()
{
char chaine[10]= "\0" ; char Fin = „O‟;
// Création d'un fichier.
FILE * pFichier = fopen("Exp2.txt", "w");
if (pFichier !=NULL) {
printf(« Ouverture du fichier en mode ecriture \n");
printf("Desirez-vous poursuivre (O ou N) ?"); scanf("%c", &Fin);
while (Fin == 'O')
{ // Saisie au clavier d'un nom.
printf("Entrez un nom : "); scanf("%9s", chaine);
// Écrire le nom dans le fichier.
fputs(chaine, pFichier);
printf("Desirez-vous poursuivre (O ou N) ?");
scanf("\n%c", &Fin);
}
fclose(pFichier); // Fermeture du fichier ouvert en écriture.
}
15
// Ouverture d'un fichier en lecture.
16
typedef struct /* Lecture du fichier par fgets+sscanf (la fin de
{ fichier est atteinte quand fgets renvoie NULL) : */
char nom[20]; while ( fgets( ligne, 81, fic) != NULL )
short int jour; {
char mois[10]; if (sscanf(ligne,"%s%hd%s%hd", pers.nom,
short int annee; &pers.jour, pers.mois, &pers.annee) == 4)
} T_ANNIV; /* on s'assure de la validité des 4 données */
void main(void) {
{ printf("\n nom: %s ", pers.nom ) ;
FILE* fic ; printf("\n date naiss: 2hd%s%hd\n",pers.jour,
char ligne[81]; pers.mois, pers.annee);
T_ANNIV pers; }
/* Ouverture du fichier (en lecture texte) : */ else
fic = fopen("essai.txt", "r") ; puts("Pb de lecture avec sscanf (format de
if (fic==NULL) ligne incorrect ?)") ;
{
puts("Pb d'ouverture du fichier essai.dat !"); }
exit(0); fclose( fic ) ;
} }
Opération d‟écriture : fprintf
/* Lecture du fichier (remarque : feof(fic) vaut 0 (faux) si fin de fichier non atteinte) : */
fscanf( fic, "Nombre d'elements : %d", &n );
for ( i=0 ; (i<n) && (!feof(fic)) ; i ++ )
fscanf( fic, "\n element %d : %d", &i_lu, &tab[i] );
/* Traitement des données lues : */
printf("\n\n Voici les valeurs lues dans le fichier :");
for (i=0; i<n; i ++) printf( "\n element %d : %d", i, tab[i] );
puts("\n\n");
/* Fermeture du fichier : */
fclose( fic ) ;
}
crée le vide le position du
mode lecture écriture
fichier fichier flux
r X début
r+ X X début
w X X X début
w+ X X X X début
a X X fin
a+ X X X fin
21
Les fichiers binaires permettent des entrées/sorties de données
au format interne de la machine.
22
L‟ouverture d‟un fichier binaire se fait en ajoutant le spécificateur b
au mode d‟ouverture de l‟appel fopen
Les accès se font via deux fonctions, fread et fwrite, avec une
interface banalisée :
int fread ( void* adr, int taille_element, int nb_elements, FILE* fic);
int fwrite ( void* adr, int taille_element, int nb_elements, FILE* fic);
Pour les tailles des données à lire ou écrire, il est conseillé d‟utiliser
systématiquement l‟opérateur sizeof.
23
double x, y;
float tab[50];
FILE *fi, *fo;
fi = fopen("data.bin", "rb");
fo = fopen("result.bin", "wb");
/* Lecture sur ‟fi‟ de 2 scalaires */
fread(&x, sizeof(double), 1, fi);
fread(&y, sizeof(double), 1, fi);
/* Ecriture sur ‟fo‟ d‟un tableau */
fwrite(tab, sizeof(float), 50, fo);
24
#include <stdio.h>
#include <stdlib.h>
#define DIM 100
void main() {
int i;
double sum,tab1[DIM],tab2[DIM];
FILE *fichier;
//Remplir un tableau
for(i=0;i<DIM;i++) tab1[i]=i;
// Ecriture du fichier au format binaire
fichier = fichier = fopen("explefbinaire.bin","wb");
if (fichier != NULL)
{ fwrite(tab1,sizeof(double),DIM,fichier);
fclose(fichier);
}
// Lecture du fichier
fichier = fichier = fopen("explefbinaire.bin","rb");
if (fichier != NULL)
{
fread(tab2,sizeof(double),DIM,fichier);
//afficher pour tester
puts("le fichier contient: \n");
for(i=0;i<DIM;i++) printf("\t%lf", tab1[i]);
fclose(fichier);
}
}
si on veut se positionner en un point quelconque du fichier sans
lire ce qui précède, afin d'accéder à une donnée particulière, la
lecture séquentielle ne convient plus : il faut un accès direct (ou
non séquentiel).
Accès à éviter