Académique Documents
Professionnel Documents
Culture Documents
1. Création de fichier
Soit un fichier d'articles de commerce ayant pour structure
typedef struct {
int numero;
char nom[20];
float prixHT;
int qte;
} TYPEART;
TYPEART article;
Créer ce fichier et le remplir avec des données de votre choix. Utiliser l'exemple de programme C [1] fourni en
annexe.
Indications:
Considérer le cas où l'article de numéro donné n'existe pas et imprimer un message dans ce cas.
http://emi.um5.ac.ma/~ntounsi/COURS/FichiersC/TP-fich... 1 of 4
Travaux pratiques fichiers et bases de données
Dans cet exemple de fichier les enregistrements sont rangées de façon consécutive et numérotées de 0 jusqu'à
n-1, pour un fichier de taille n.
En langage C, La taille d'un fichier est exprimée en nombre d'octets. Ici on a un fichier de taille physique 32x5 =
160 octets. Le début de l'enregistrement "CD" se trouve à l'octet 64 (32 *2) car il est précédé de 2
enregistrements.
L'appel à la fonction seek permet de se positionner sur un enregistrement avant sa lecture. Le positionnement
se calcule en nombre d'octets depuis le début du fichier. Si les enregistrements sont de taille 32 comme ici,
l'appel
fseek (farticle, 64, SEEK_SET);
positionne la lecture dans le fichier farticle sur le début de l'enregistrement n° 2 ("CD"). La constante SEEK_SET
(valant 0) sert à indiquer que le calcul 62 se fait par rapport au début du fichier.
lit l'enregistrement qui contient "CD". (On aura article.num = 34, article.nom = "CD" etc.)
Remarque: On a SEEK_CUR ou SEEK_END, valant respectivement 1 et 2, qui indiquent le calcul par rapport à la
position courante ou la fin de fichier resp.
Exercice: Ecrire un programme qui saisit un entier n et qui lit le n-ième enregistrement dans le fichier pour
afficher son nom. Pour n = 4 on doit afficher Livre. (Créer au préalable le fichier ci-dessus).
Dans l'exercice précédent, on accède directement à un article étant donné son rang dans le fichier (si toutefois
on le connaît). Or le rang n'est une caractéristique d'article comme le numéro, le prix ou le nom.
On voudrait surtout accéder à un article étant donné son numéro (ou son nom ou autre caractéristique). On
accède directement à l'article "11, Livre, 2, 22" en donnant son numéro article 11 (on dit aussi clé).
Une idée de réaliser cet accès est de créer un index. C'est un deuxième fichier qui contient pour chaque clé
numéro d'article, le rang physique de l'enregistrement dans le fichier. C'est à dire au numéro d'article 11 on fait
correspondre le rang 3. Voir figure ci-dessous.
Le fichier index est constitué d'enregistrements ayant deux champs <clé, rang>. Le fichier index est trié par
rapport au champs clé.
http://emi.um5.ac.ma/~ntounsi/COURS/FichiersC/TP-fich... 2 of 4
Travaux pratiques fichiers et bases de données
Etape 1: On parcourt d'abord le fichier index à la recherche de l'enregistrement de clé 11 (recherche triée,
cf. §4 ci-dessus). On a alors la valeur 3 de l'autre champ.
Etape 2: On accède ensuite au fichier indexé article directement à l'enregistrement de rang 3. Qui est livre
ici.
On parcourt séquentiellement le fichier article à indexer, et on sauvegarde dans un tableau les couples
<numéro article, i> i=0..n. Soit ici <12, 0>, <5, 1>, <34, 2>, <11, 3>, <8, 4> etc. On trie ce tableau
par ordre croissant de numéro article. Soit <5, 1>, <8, 4>, <11, 3> etc. On crée ensuite le fichier index
à partir de ce tableau trié.
NB. Dans un premier temps, on ne considérera pas cette méthode, et on créera l'index "à la main" (en saisissant
les valeurs sur le calvier) pour se concentrer sur la recherche indexée (Etape 1 et 2 ci-dessus).
Exercices:
1. Ecrire un programme C qui crée les deux fichiers, index et indexé, ci-dessus. Utiliser le programme de la
question 1 pour cela. On s'appliquera à rentrer des valeurs justes pour l'index!
2. Ecrire un programme qui fait la recherche du nom d'un article étant donné son numéro. Le programme
doit utiliser l'index ainsi créé.
3. Faire de même avec un index sur les noms cette fois-ci. Ecrire le programme qui cherche le prix d'un
article de nom donné.
Dans ce dernier cas, peut-on considérer des noms double? (Rep: oui. Si par exemple il y a deux ou trois
nom "Montre", dans le fichier index, il y aura 2 ou 3 d'enregistrements qui se suivent et qui pointent
chacun sur l'article correspondant).
Annexe
[1] Création de fichier
#include <stdio.h>
#include <sys/stat.h>
typedef#include <stdio.h>
#include <sys/stat.h>
/*#include <conio.h>*/
typedef struct {
int numero;
char nom[20];
float prixHT;
int qte;
} TYPEART;
int lireArticle();
int main() {
int n;
http://emi.um5.ac.ma/~ntounsi/COURS/FichiersC/TP-fich... 3 of 4
Travaux pratiques fichiers et bases de données
int lireArticle(){
printf("rentrer numero article (0=fin): ");
scanf("%d", &article.numero);
if (article.numero == 0) return; /* fin */
printf("rentrer nom article: ");
scanf("%s", article.nom);
printf("rentrer prixHT article: ");
scanf("%f", &article.prixHT);
printf("rentrer quantité en stock: ");
scanf("%d", &article.qte);
}
typedef struct {
int numero;
char nom[20];
float prixHT;
int qte;
} TYPEART;
int main() {
FILE *farticle;
TYPEART article;
int n;
/* Ouverture fichier */
farticle = fopen("article.dat", "r");
http://emi.um5.ac.ma/~ntounsi/COURS/FichiersC/TP-fich... 4 of 4