Les fichiers
Objectifs du chapitre
-
Stocker séquentiellement des informations dans des fichiers binaires.
-
Lire séquentiellement un fichier binaire.
-
Accéder directement à un enregistrement de fichier binaire.
-
Lire et écrire dans un fichier texte.
-
Comprendre la différence entre fichier texte et fichier binaire.
Les fichiers en C
1. Présentation
En C, un fichier est une suite d’octets placés à une certaine adresse sur un disque.
Cette définition est générale à tous les fichiers et définit un fichier binaire.
C prévoit toutefois deux sortes de fichiers : texte ou binaire.
Un fichier texte est un fichier binaire interprétable par un éditeur de texte.
Travailler avec un fichier nécessite :
-
La déclaration d’un pointeur vers une variable (un ensemble de données) de type FILE.
-
L’ouverture du fichier : affectation du pointeur, adresse du fichier ou plus exactement adresse d’un ensemble de données de type FILE qui contient tous les renseignements sur le fichier.
-
L’utilisation du fichier : lectures, écritures.
-
La fermeture du fichier.
2. Lecture et écriture
-
Lecture : transfert de données du disque vers la mémoire.
-
Écriture : transfert de données de la mémoire vers le disque.
3. Options d’ouverture d’un fichier
Quand on ouvre un fichier en langage C, il est possible de préciser s’il s’agit :
-
d’un fichier texte (t)
-
d’un fichier binaire (b).
Il est également possible de préciser les actions qu’on souhaite y faire :
-
lire le fichier (r : read)
-
créer le fichier et y écrire (w : write)
-
ajouter des informations à la fin du fichier...
Création d’un nouveau fichier binaire : écriture séquentielle
Le programme suivant permet de créer un fichier nommé "stagiaires", qui contient une succession d’enregistrements de type STAGIAIRE.
1. Structure des enregistrements
typedef struct
{
int numero;
char nom[51];
} STAGIAIRE;
2. Programme de création du fichier
-
fichier : pointeur vers le fichier.
-
s : variable destinée à l’écriture sur le fichier.
-
codeRetour : entier destiné à tester le code retour des fonctions liées au fichier.
-
ligne : chaîne pour les saisies au clavier.
int main()
{
FILE* fichier;
STAGIAIRE s;
int codeRetour;
char ligne[81];
fopen() : ouverture du fichier binaire (b) stagiaires en écriture (w). Le pointeur fichier connaît désormais l’adresse du fichier où il faut écrire. Si la fonction fopen() retourne 0, c’est que l’ouverture a échoué.
fichier = fopen("C:\\C\\fichiers\\stagiaires", "wb");
if (fichier == 0)
{
printf(" *** Erreur d'ouverture du fichier stagiaires ***\n");
exit(0);
}
Attention...
Lecture séquentielle d’un fichier binaire et écriture dans un fichier texte
Le programme suivant permet de lire le fichier "stagiaires", et d’écrire les informations de chaque enregistrement dans un fichier texte.
1. Structure des enregistrements
typedef struct
{
int numero;
char nom[51];
} STAGIAIRE;
2. Programme de lecture du fichier
-
fichier : pointeur vers le fichier à lire ("stagiaires") ;
-
edition : pointeur vers le fichier texte d’édition ;
-
s : variable destinée à la lecture du fichier "stagiaires".
int main()
{
FILE* fichier;
FILE* edition;
STAGIAIRE s;
La suite du programme montre l’ouverture du fichier binaire (b) stagiaires en lecture (r) et l’ouverture du fichier texte (t) en écriture (w).
fichier = fopen("C:\\C\\fichiers\\stagiaires", "rb");
if (fichier == 0)
{
printf(" *** Erreur d'ouverture du fichier stagiaires ***");
exit(0);
}
edition = fopen("C:\\C\\fichiers\\editStagiaires.txt", "wt");
if (edition == 0)
{
printf("...
Ajout d’un tableau d’enregistrements au fichier binaire
Ajout d’un tableau d’enregistrements dans le fichier "stagiaires".
tabStag est un tableau de trois variables de type STAGIAIRE :
int main()
{
FILE* fichier;
STAGIAIRE tabStag[3];
int codeRetour;
La suite du programme montre l’ouverture du fichier binaire (b) "stagiaires" en ajout (a). La "tête d’écriture" est automatiquement positionnée en fin de fichier.
fichier = fopen("C:\\C\\fichiers\\stagiaires", "ab");
if (fichier == 0)
{
printf(" *** Erreur d'ouverture du fichier stagiaire ***\n");
exit(0);
}
tabStag[0].numero = 150;
strcpy(tabStag[0].nom, "PERDREAU");
tabStag[1].numero = 151;
strcpy(tabStag[1].nom, "BOUVREUIL");
tabStag[2].numero = 152;
strcpy(tabStag[2].nom, "TICHODROME");
L’écriture du tableau dans le fichier est réalisée avec l’instruction fwrite() qui ajoute trois enregistrements STAGIAIRE dans le fichier. Le troisième paramètre est le nombre de blocs à écrire. Ici, on écrit...
Lecture directe et mise à jour d’un fichier binaire
Le programme suivant permet de modifier des enregistrements du fichier "stagiaires".
1. Programme de modification du fichier
numEnreg : numéro de l’enregistrement à modifier.
int main()
{
FILE* fichier;
STAGIAIRE s;
int codeRetour;
char ligne[81];
int numEnreg;
Ouverture du fichier binaire (b) stagiaires en modification (r+). .
fichier = fopen("C:\\C\\fichiers\\stagiaires", "r+b");
if (fichier == 0)
{
printf(" *** Erreur d'ouverture du fichier stagiaires ***");
exit(0);
}
Saisie du numéro d’enregistrement à modifier :
printf("Numero de l'enregistrement a modifier : ");
gets(ligne);
Tant que l’on n’a pas saisi un numéro vide, la boucle de modification s’exécute :
while (ligne[0] != 0)
{
numEnreg = atoi(ligne);
fseek() : cette fonction positionne la tête de lecture/écriture dans le fichier.
Cette position est calculée à partir du début du fichier : option SEEK_SET.
Le numéro de l’octet...
Différences de codage entre un fichier binaire et un fichier texte
Ce programme écrit la même variable i dans un fichier binaire et dans un fichier texte.
-
binaire : pointeur vers un fichier binaire ;
-
texte : pointeur vers un fichier texte ;
-
i : entier à écrire dans les deux fichiers.
int main()
{
FILE* binaire;
FILE* texte;
int i;
binaire = fopen("C:\\C\\fichiers\\binaire", "wb");
if (binaire == 0)
{
. . .
}
texte = fopen("C:\\C\\fichiers\\texte", "wt");
if (texte == 0)
{
. . .
}
i = 17;
L’instruction suivante écrit la valeur de l’entier 17 dans le fichier binaire. Un entier fait quatre octets. Le premier des quatre octets contient 17 (11 en hexadécimal), les trois autres contiennent 00.
fwrite(&i, sizeof(int), 1, binaire);
L’instruction suivante convertit l’entier i en caractères : le caractère ’1’ et le caractère ’7’ et les écrit dans le fichier texte. 31 et 37 sont les codes ASCII en hexadécimal des caractères ’1’...
Travail pratique : fichier des employés
1. Sujet
a. Exercice 1
Créer un fichier des employés.
La structure EMPLOYE a la forme suivante :
typedef struct
{
int numero;
char nom[51];
char prenom[41];
int numeroAgence;
} EMPLOYE;
Faire une boucle de saisie du numéro et des trois autres champs.
Voici le résultat attendu à l’exécution de ce programme :
b. Exercice 2
Lire le fichier, afficher les employés.
c. Exercice 3
Lire le fichier, afficher les employés, avec le nom de l’agence.
Voici le résultat attendu à l’exécution de ce programme :
d. Annexe 1 : fonction chercheAgence(), fichier agences.h
La fonction chercheAgence() permet de trouver le numéro d’enregistrement dans le fichier des agences ("agences") d’une agence dont on connaît le numéro identifiant.
Le prototype de cette fonction se trouve dans le fichier : agences.h.
Le code binaire de cette fonction se trouve dans : agences.o
Le fichier "agences" se trouve dans le répertoire C:\C\fichiers.
Le numéro d’enregistrement retourné par la fonction chercheAgence() permet de récupérer le nom de l’agence.
Afficher : « agence inconnue » si le numéro d’agence n’existe pas dans le fichier.
Voici le contenu du fichier agences.h :
typedef struct
{
int numero;
char nom[81];
} AGENCE;
La fonction chercheAgence() retourne le numéro de l’enregistrement correspondant à numeroAgence ou -1 si numeroAgence n’existe pas dans le fichier :
int chercheAgence(int numeroAgence, FILE* fichierAgences);
Le code source de la fonction chercheAgence et le programme de création du fichier des agences sont disponibles dans les projets biblAgences et creationAgences depuis la page Informations générales.
e. Annexe 2 : liste des agences
Voici la liste des agences contenues dans le fichier agences :