Vous êtes sur la page 1sur 9

LES TRAITEMENTS SUR LES FICHIERS

I. Définition
Le type Enregistrement est une structure de données permettant de regrouper un ensemble de
données de types différents sous une même variable.
Remarques
(i) Un enregistrement est composé d’une ou plusieurs variables non nécessairement de
même type, appelées Champs ou Rubriques.
(ii) Le type Enregistrement est dit également le type Structure.

II. Représentation Algorithmique


Un type enregistrement doit être déclaré dans la partie réservée aux types, selon la syntaxe
suivante :
TYPE
Nom_type = ENREGISTREMENT
Nom_rubrique1 : type_rubrique1
………….
Nom_rubriqueN : type_rubriqueN
FinEnregistrement
VARIABLE
Nom_variable : Nom_type

Remarque :

Si certaines rubriques ont le même type, on peut les déclarer ensemble en les séparant par des
virgules et en mentionnant une seule fois le type.

Exemple : déclaration de l’enregistrement étudiant.


TYPE
Étudiant = ENREGISTREMENT
Nom : Chaîne (20)
Prénom (30)
CIN : entier
Age : entier
FinEnregistrement
VARIABLE E : Étudiant

En mémoire, en déclarant une variable E, l’espace réservé aura l’allure suivante :


Nom Prénom CIN Age
E

1. Accès aux Rubriques


Pour accéder aux rubriques d’un enregistrement, on doit effectuer tout d’abord une opération
lecture, écriture, affectation, etc. en outre, cet accès peut être total ou partiel :
- Dans le cas où l’accès est total, on utilise Nom_variable.
- Dans le cas où l’accès se fait à une rubrique, on utilise Nom_variable.Nom_rubrique
1
 Lecture d’un Enregistrement
a-) Totale : Lire(E) cette primitive va lire en un seul coup et à partir du clavier les différentes
rubriques de l’enregistrement Etudiant.
La saisie s’effectuera comme suit : Ben Mohamed Mohamed 123456 35.
On remarque qu’une telle saisie n’est pas très appréciée ; par contre pour certains problèmes
on peut l’utiliser : lire un enregistrement et le stocker dans une autre variable.

b-) Partielle : la lecture se fait rubrique par rubrique. On l’utilise généralement pour une saisie
conviviale à l’écran. Dans notre exemple, la saisie de l’enregistrement Etudiant se fera alors :
Nom_variable = E
Nom_rubrique = Nom ou Prénom ou CIN ou Age
Lire(E.Nom) (* on lira alors le nom Ben Mohamed *)
Lire(E.Prénom) (* on lira alors le prénom Mohamed *)
Lire(E.CIN) (* on lira alors le numéro CIN 123456 *)
Lire(E.Age) (* on lira alors l’age 35 *)

 Ecriture d’un Enregistrement


a-) Totale : Ecrire(E) est une primitive qui affiche les valeurs des différentes rubriques d’une
manière assemblée ; elle peut être utilisée si jamais on veut écrire dans un fichier (voir chapitre
suivant).

b-) Partielle : l’écriture se fait rubrique par rubrique ; elle est conseillée s’il s’agit d’un dialogue
entre l’utilisateur et le programme. Dans notre exemple, on peut afficher l’enregistrement
étudiant après l’avoir saisi, rubrique par rubrique selon la syntaxe suivante :
Ecrire (Nom_variable.Nom_rubrique)

Nom_variable = E
Nom_rubrique = Nom ou Prénom ou CIN ou Age

Ecrire (E.Nom) (* on affichera alors le nom Ben Mohamed *)


Ecrire (E.Prénom) (* on affichera alors le prénom Mohamed *)
Ecrire (E.CIN) (* on affichera alors le numéro CIN 123456 *)
Ecrire (E.Age) (* on affichera alors l’age 35 *)

 Affectation d’un Enregistrement


a-) Totale : il s’agit dans ce cas d’affecter les valeurs prises par les rubriques dans une autre
variable qui doit avoir obligatoirement le même type que Nom_variable.
Dans notre exemple, on suppose que E et E1 sont de variables de type Étudiant, et dans ce
cas on peut effectuer une affectation totale, bien sûr si le contexte de l’exercice le demande :
E1  E ; on aura alors,

E1= Ben Mohamed Mohamed 123456 35

b-) Partielle : selon le contexte de l’exercice, l’affectation peut se faire partiellement c’est à dire
rubrique par rubrique, selon la syntaxe suivante :

Nom_variable.Nom_rubrique = Nom_variable1.Nom_rubrique
2
Dans notre exemple, supposons que l’on souhaite copier un enregistrement dans une autre
variable ; on aura alors :
Sachant que E et E1 sont de variables de type Étudiant ; on peut écrire :
E1.Nom  E.Nom
E1.Prénom  E.Prénom
E1.CIN  E.CIN
E1.Age  E.Age

Ce qui donne
E1.Nom  ‘Ben Mohamed’
E1.Prénom  ‘Mohamed’
E1.CIN  123456
E1.Age  35

Notion de Générateur
Quand on affecte des valeurs aux rubriques d’un enregistrement, on dit qu’on a obtenu un
Générateur.

Un générateur est mathématiquement une classe de la relation enregistrement : c’est


l’ensemble de valeurs que peuvent avoir à un instant donné, les différentes rubriques d’un
enregistrement.

Si on revient à l’exemple de l’enregistrement Etudiant, les informations suivantes :


Ben Mohamed,Mohamed,123456,35 constituent un générateur de l’enregistrement
Etudiant.
Les valeurs d’un générateur sont délimitées par deux parenthèses :
G1 = (‘Ben Mohamed’,’Mohamed’,123456,35)
Dans un enregistrement, on peut représenter plusieurs générateurs; mais à un instant donné, il
ne peut contenir qu’un seul générateur.

2. Enregistrement de Taille Variable

Problématique :
On souhaite gérer les informations concernant les salariés d’une entreprise qui diffèrent d’une
catégorie à une autre. En voici les informations à implémenter :
Matricule du salarié, Nom du salarié, Prénom du salarié, Date de naissance du salarié, Etat civil
du salarié.
Si le salarié est permanent, on indique le salaire de base et le montant des indemnités.
Si le salarié est occasionnel, on indique le coût horaire, le nombre d’heures travaillées.
Si le salarié est marié, on indique le nom et le prénom du conjoint ainsi que le nombre
d’enfants.
Si le salarié est célibataire, on indique s’il est en règle avec le service militaire.

Question : Proposer une structure de données ?

3
Solution : on va déclarer un type enregistrement appelé Salarié qui comportera les rubriques
suivantes :
CONSTANTE
N = 200
TYPE
Tab_Salarié = Tableau[1..N] de Salarié

Salarié = ENREGISTREMENT
Matricule : entier
Nom, Prénom : chaine
Date_naissane : chaine
État_civil : (marié, célibataire)
Catégorie : (permanent, occasionnel)
Salaire_base : réel
Indemnités : réel
Nom_conjoint, Prénom_conjoint : chaine
Nombre_enfant : entier
Coût_horaire : réel
Nombre_heures : réel
Service_militaire : Booléen
FinEnregistrement

On vient de déclarer un tableau de 200 salariés et chaque élément du tableau est censé
comporter les informations relatives à un salarié.
Matric Nom Préno Datn Eciv. Cat. SBas Indem NomC PrénC Nenf Chor Nbh SM
1 123 Ali Med 1164 M P 500 250 Med Alia 1 -- -- --
2 456 Med Sobhi 1155 C O -- -- -- -- -- 3.200 70 Oui
……………..
200

On vient de représenter deux générateurs de l’enregistrement Salarié. On remarque à première


vue, que les rubriques de part et d’autre ne sont pas totalement remplies : cela s’explique par le
fait, qu’en fonction des spécificités de chaque salarié on ne remplit que les cases permises.
On est alors en présence de cases mémoires vides et ne pouvant plus être exploitées ! On
parle alors de ‘trous’ en mémoire. Comme la mémoire est une ressource à ne pas gaspiller, une
telle situation n’est pas appréciable.
L’idéal est que chaque générateur occupe uniquement les cases qui lui sont allouées. Pour ce
faire, il faut alors utiliser une structure qui peut varier en fonction des spécificités de chaque
générateur. Une telle structure existe et elle est appelée : Enregistrement Variable.

Définition
Un type enregistrement est dit variable si lors de sa définition certaines rubriques ne peuvent
apparaître que sous condition(s).

Représentation Algorithmique

TYPE
4
Nom_type = ENREGISTREMENT
Nom_rubrique1 : type_rubrique1
Nom_rubrique2 : type_rubrique2
Nom_rubrique3 : type_rubrique3
……………..
……………..
Nom_rubrique_variable : type_rubrique_variable
SELON (type_rubrique_variable) FAIRE
Val1_type_rubrique_variable :
Nom_rubrique_v1 : type_rubrique_v1
Nom_rubrique_v2 : type_rubrique_v2
Nom_rubrique_v3 : type_rubrique_v3
Val2_type_rubrique_variable :
Nom_rubrique_v1 : type_rubrique_v1
Nom_rubrique_v2 : type_rubrique_v2
Nom_rubrique_v3 : type_rubrique_v3
………
………
FINSELON
FINENREGISTREMENT

Exemple de l’enregistrement Salarié


CONSTANTE
N = 200
TYPE
Tab_Salarié = Tableau[1..N] de Salarié
Situation = (marié, célibataire)
Cat = (permanent, occasionnel)
Salarié = ENREGISTREMENT
Matricule : entier
Nom, Prénom : chaine
Date_naissane : chaine
Catégorie : Cat
État_civil : Situation
SELON (Situation) FAIRE
Marié : Nom_conjoint, Prénom_conjoint : chaine
Nombre_enfant : entier
Célibataire : Service_militaire : Booléen
FINSELON
SELON (Cat) FAIRE
Permanent : Salaire_base : réel
Indemnités : réel
Occasionnel : Coût_horaire : réel
Nombre_heures : réel
FINSELON
FINENREGISTREMENT
Représentation des deux générateurs
Avant :
G1(123,’Ali’,’Med’,’1164’,Marié,Permanent,’Med’,’Alia’,1, ,500 ,250)
5
G2(456,’Med’,’Sobhi’,’1155’,Célibataire,Occasionnel, , , , , ,3.200,70,Oui)

En utilisant, l’enregistrement variable, on aura :


G1(123,’Ali’,’Med’,’1164’,Marié,Permanent,’Med’,’Alia’,1,500,250)
G2(456,’Med’,’Sobhi’,’1155’,Célibataire,Occasionnel,3.200,70,Oui)

Remarques
(i) On voit maintenant que les deux générateurs ne comportent plus de cases vides et
par conséquent plus de trous en mémoire.
(ii) On voit également clair que les deux générateurs G1 et G2 sont de tailles variables.
(iii) Dans un enregistrement variable, on doit tout d’abord déclarer la partie fixe puis on
définit la partie variable.
(iv) Attention, il ne faut pas confondre entre le SELON vu dans le chapitre Structures
Conditionnelles et le SELON vu dans ce chapitre : le premier concerne des
instructions ; quant au deuxième il concerne des variables. C’est une erreur fréquente
de la part des étudiants !?

Accès aux Rubriques


En prenant les deux générateurs de l’exemple, on va essayer d’accéder à chacune de leur
rubrique :
G1(123,’Ali’,’Med’,’1164’,Marié,Permanent,’Med’,’Alia’,1)
G2(456,’Med’,’Sobhi’,’1155’,Célibataire,Occasionnel,3.200,70,Oui)

TYPE
Salarié = ENREGISTREMENT
Matricule : entier
Nom, Prénom : chaine
Date_naissane : chaine
Catégorie : Cat
État_civil : Situation
SELON (Situation) FAIRE
Marié : Nom_conjoint, Prénom_conjoint : chaine
Nombre_enfant : entier
Célibataire : Service_militaire : Booléen
FINSELON
SELON (Cat) FAIRE
Permanent : Salaire_base : réel
Indemnités : réel
Occasionnel : Coût_horaire : réel
Nombre_heures : réel
FINSELON
FINENREGISTREMENT

VARIABLE S : Salarié

G1(123,’Ali’,’Med’,’1164’,Marié,Permanent,’Med’,’Alia’,1,500,250)
G2(456,’Med’,’Sobhi’,’1155’,Célibataire,Occasionnel,3.200,70,Oui)

Pour un salarié permanent et marié, on aura :


6
S.Matricule 123
S.Nom  ‘Ali’
S.Prénom  ‘Med’
S.Date_naissane  ‘1164’
S.Etat_civil  Marié
S.Catégorie  Permanent
S.Nom_conjoint  ‘Med’
S.Prénom_conjoint  ‘Alia’
S.Nombre_enfant  1
S.Salaire_base  500
S.Indemnités  250

Pour un salarié occasionnel et célibataire, on aura :


S.Matricule 456
S.Nom  ‘Med’
S.Prénom  ‘Sobhi’
S.Date_naissane  ‘1155’
S.Etat_civil  Célibataire
S.Catégorie  Occasionnel
S.Service_militaire  Oui
S.Coût_horaire  3.200
S.Nombre_heures  70

Le Concept Fichier

Un fichier est un ensemble d’informations stockées en mémoire secondaire et structuré en


enregistrements.
On dit également qu’un fichier est un ensemble d’enregistrements.

Exemples
Fichier des salariés d’une société.
- Fichier des comptes clients en banque.
- Fichier d’abonnés de la STEG ou de la SONEDE.
- Fichier des étudiants d’une institution universitaire.
- Fichier Stock d’une entreprise commerciale.
- Etc.

Le Système de Gestion de Fichiers : SGF


Les mémoires secondaires tels que le disque dur, la disquette, la bande magnétique, etc., ne
sont pas coûteux, possèdent de grandes capacités de stockage et sont non volatiles.
L’acheminement des informations dans des fichiers existants sur ces supports se fait à l’aide de
primitives incluses dans le système d’exploitation et plus exactement dans la couche qui est
responsable de la gestion des fichier ; elle s’appelle SGF ou encore le Système de Gestion de
Fichiers. Les principales fonctions d’un tel système sont : l’ajout d’un élément dans un fichier, la
suppression d’un élément, la mise à jour d’un élément et la recherche d’un élément dans un
fichier.

Organisation des Fichiers et Méthodes d’Accès

7
Problématique :
Comment trouver dans un fichier un enregistrement dont on connaît une référence ?
Cela va dépendre de la façon dont sont organisés les enregistrements entre eux. En fait, ça
dépend du type d’organisation du fichier. On distingue :
- l’organisation séquentielle
- l’organisation indexée
- l’organisation relative
- l’organisation sélective.

Pour accéder à un enregistrement, il faut avant tout voir le type d’organisation, puis voir est ce
que le type d’accès désiré est permis dans une telle organisation ou non !
Par exemple, si on dispose d’une bande magnétique (l’équivalent d’une K7), il est facile de
deviner que l’organisation est séquentielle. Pour atteindre le nième enregistrement, on doit
obligatoirement parcourir les (n-1) enregistrements précédents et il n’y a pas d’autres solutions
(imaginer que vous voulez écouter la 3ème chanson d’une K7, obligatoirement vous devez défiler
les 2 chansons précédentes).
Maintenant, si le support est un disque magnétique, son organisation n’est pas uniquement
séquentielle mais elle peut être indexée : pour atteindre le nième enregistrement, on peut soit
parcourir les (n-1) enregistrement précédents ou si on a une référence, on l’introduit et on
accède directement à l’enregistrement y afférent (prenons l’exemple d’un disque musical, on
peut accéder directement à la chanson préférée ou écouter séquentiellement les chansons
jusqu’à ce que votre chanson préférée se manifeste).

Donc, une méthode d’accès est une façon d’atteindre un enregistrement ; il y a essentiellement
deux méthodes d’accès :
- accès séquentiel
- accès direct

Organisation Séquentielle :

a-) Définition
L’organisation séquentielle consiste à mettre les enregistrements dans le fichier les uns après
les autres selon l’ordre de leur arrivée. Elle peut être définie sur tout type de support de
mémoire secondaire. Cette organisation ne permet que l’accès séquentiel.

b-) Les Primitives


 Ouverture d’un fichier : avant tout traitement sur les fichiers, il faut ouvrir les
fichiers y afférents.
Ouvrir (nom_fichier, mode_ouverture)
Le mode d’ouverture est soit Lecture(L) ou (exclusif) Ecriture(E)
 Fermeture d’un fichier : une fois le traitement achevé, il ne faut pas oublier de
fermer tout fichier ouvert.
Fermer (nom_fichier)
 Lecture d’un Enregistrement à partir d’un fichier
Lire (nom_fichier, nom_enregistrement)
 Écriture d’un enregistrement dans un fichier : c’est la même chose de dire ajouter
un enregistrement dans un fichier.
Écrire (nom_fichier, nom_enregistrement)
Remarques :
(i) L’ajout se fait toujours en fin de fichier.
8
(ii) Tout fichier possède un booléen indiquant si la fin de fichier est atteinte ou non ; on
peut la noter EOF : End Of File et on peut appliquer les opérateurs logiques sur cette
variable booléenne : par exemple on peut dire si NON (EOF) pour indiquer si la fin de
fichier n’est pas atteinte alors on va exécuter tel traitement. Cette variable va
obligatoirement avec le nom du fichier : EOF (nom_fichier)
(iii) Dans certains langages, après l’ouverture d’un fichier, il faut l’initialiser : en Pascal
c’est la primitive RESET (nom_fichier).

Organisation Indexée

a-) Définition
Un fichier dispose d’une organisation indexée, si chaque enregistrement est identifié par son
index dans une table d’index.
Cet index est une rubrique du fichier (ou plusieurs) qui identifie d’une manière unique un et un
seul enregistrement.

b-) Les Primitives


 Ouverture du fichier
Ouvrir (nom_fichier, Mode_ouverture)
Le mode d’ouverture peut être soit lecture, soit écriture soit lecture/écriture.
 Fermeture d’un fichier
Fermer (nom_fichier)
 Lecture séquentielle d’un enregistrement
Lire (nom_fichier, nom_enregistrement)
 Lecture indexée d’un enregistrement
Lire (nom_fichier, clé, nom_enregistrement, zone_tampon)
 Écriture d’un enregistrement dans un fichier à sa bonne place
Écrire (nom_fichier, clé, nom_enregistrement, zone_tampon)
 Suppression d’un enregistrement
Supprimer (nom_fichier, clé)
Remarques :
(i) L’ajout se fait en fonction de la valeur de la clé.
(ii) Tout fichier possède un booléen indiquant si la fin de fichier est atteinte ou non ; on
peut la noter EOF : End Of File et on peut appliquer les opérateurs logiques sur cette
variable booléenne : par exemple on peut dire si NON (EOF) pour indiquer si la fin de
fichier n’est pas atteinte alors on va exécuter tel traitement. Cette variable va
obligatoirement avec le nom du fichier : EOF (nom_fichier)
(iii) Dans certains langages, après l’ouverture d’un fichier, il faut l’initialiser : en Pascal
c’est la primitive RESET (nom_fichier).


On dit Index et parfois clé
9

Vous aimerez peut-être aussi