Module 08 · Leçon 3
Fichiers typés
Ce que vous saurez faire
- Associer un fichier logique à un chemin physique
- Créer, lire, écrire et fermer un fichier typé
- Détecter la fin de fichier (EOF)
Avant de commencer
Un tableau a une taille fixée à la compilation. Pour stocker un nombre inconnu d'éléments (ex. la base de données des notes), il faut un fichier. Comment lire et écrire un fichier en Pascal ?
1. Qu'est-ce qu'un fichier typé ?
Chaque fichier a deux noms :
- Logique : la variable Pascal (ex.
F). - Physique : le chemin sur le disque (ex.
"C:\notes.dat").
2. Déclaration
T.D.N.T
─────────────────────────────────
Type
FICH_NOTES = Fichier de réel
─────────────────────────────────
T.D.O
─────────────────────────────────
F : variable FICH_NOTES
x : variable réel
─────────────────────────────────
T.D.N.T
─────────────────────────────────
Type
FICH_NOTES = Fichier de réel
─────────────────────────────────
T.D.O
─────────────────────────────────
F : variable FICH_NOTES
x : variable réel
─────────────────────────────────
PROGRAM ExempleFichier;
TYPE
Fich_Notes = FILE OF real;
VAR
F : Fich_Notes;
x : real;
BEGIN
{ ... }
END.
3. Opérations de base
| Algorithme | Pascal | Rôle |
|---|---|---|
Associer(F, chemin) | Assign(F, chemin) | Lie la var logique au chemin physique |
Recréer(F) | Rewrite(F) | Crée vide (ou écrase) et ouvre en écriture |
Ouvrir(F) | Reset(F) | Ouvre en lecture, pointeur au début |
Ecrire(F, x) | Write(F, x) | Écrit x, avance pointeur |
Lire(F, x) | Read(F, x) | Lit dans x, avance pointeur |
Fin_fichier(F) | Eof(F) | Vrai si pointeur en fin |
Fermer(F) | Close(F) | Libère le fichier |
États possibles
| État | Recréer | Ouvrir |
|---|---|---|
| Le fichier existe | Le remplace par un vide | Positionne au début |
| Le fichier n'existe pas | Crée un vide et l'ouvre | Erreur |
4. Exemple : créer un fichier de notes
PROGRAM EcrireNotes;
TYPE
Fich_Notes = FILE OF real;
VAR
F : Fich_Notes;
x : real;
rep : char;
BEGIN
Assign(F, 'C:\notes.dat');
Rewrite(F); { crée ou écrase }
REPEAT
Write('Note : ');
Readln(x);
Write(F, x);
Write('Continuer (O/N) ? ');
Readln(rep);
UNTIL UpCase(rep) = 'N';
Close(F); { TOUJOURS fermer }
END.
5. Exemple : lire toutes les notes
PROGRAM LireNotes;
TYPE
Fich_Notes = FILE OF real;
VAR
F : Fich_Notes;
x : real;
BEGIN
Assign(F, 'C:\notes.dat');
Reset(F); { ouvre en lecture }
WHILE NOT Eof(F) DO
BEGIN
Read(F, x);
Writeln(x:5:2);
END;
Close(F);
END.
6. Fonctions/procédures avancées
| Algorithme | Pascal | Rôle |
|---|---|---|
Position_fichier(F) | FilePos(F) | Position courante (0 = début) |
Pointer(F, n) | Seek(F, n) | Aller au bloc n |
Taille_fichier(F) | FileSize(F) | Nombre d'éléments |
Effacer(F) | Erase(F) | Supprime le fichier physique |
Renommer(F, nv) | Rename(F, nv) | Renomme (fichier doit être fermé) |
Tronquer(F) | Truncate(F) | Coupe à la position courante |
7. Exercices
Écrire un programme qui ouvre un fichier notes.dat et compte combien
de notes il contient (sans utiliser FileSize).
Voir le corrigé
Reset(F);
n := 0;
WHILE NOT Eof(F) DO
BEGIN
Read(F, x);
n := n + 1;
END;
Close(F);
Writeln('Nombre : ', n);
Alternative avec FileSize(F) : 1 ligne, plus rapide.
Soit F1 un fichier de réels. Créer un fichier F2 qui ne contient
que les notes >= 12.
Voir le corrigé
PROGRAM Filtrer;
TYPE Fich = FILE OF real;
VAR
F1, F2 : Fich;
x : real;
BEGIN
Assign(F1, 'notes.dat'); Reset(F1);
Assign(F2, 'bonnes.dat'); Rewrite(F2);
WHILE NOT Eof(F1) DO
BEGIN
Read(F1, x);
IF x >= 12 THEN
Write(F2, x);
END;
Close(F1); Close(F2);
END.
Augmenter chaque note de 1 point dans notes.dat, directement dans
le fichier (sans utiliser de second fichier). Utiliser Seek et
FilePos.
Voir le corrigé
Reset(F);
WHILE NOT Eof(F) DO
BEGIN
pos := FilePos(F);
Read(F, x); { Read avance le pointeur }
Seek(F, pos); { Revenir à la position }
x := x + 1;
Write(F, x); { Écrase l'ancienne valeur }
END;
Close(F);
C'est typiquement le genre d'opération qui exige les fonctions de positionnement.
8. Erreurs fréquentes au bac
- Oublier
AssignavantRewrite/Reset→ erreur d'exécution. - Faire
Resetsur un fichier inexistant → erreur (Rewriteaurait marché). - Oublier
Closeà la fin (peut laisser le fichier corrompu). - Lire après
Eof→ erreur.
9. Quiz
Quiz (5 questions)
Pour CRÉER un nouveau fichier (ou en remplacer un), on utilise :
Pour OUVRIR un fichier existant en lecture, on utilise :
Eof(F) retourne :
Si on oublie Close à la fin :
Pour aller au bloc d'indice 4 (5ème élément, numérotation à partir de 0) :