Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
ACCUEIL PASCAL FORUM PASCAL F.A.Q PASCAL TUTORIELS PASCAL SOURCES COMPILATEURS OUTILS LIVRES

Apprendre à manier les fichiers

5 juin 2000 par Haypo

 

Un fichier, c'est quoi ? C'est une partie de votre disque dur où sont stockées des informations à perpétuité (bon, après 3 ans ça commence à devenir illisible ...), à la différence de la mémoire qui est effacé constament et qui pert toutes les données à chaque redémarrage.
Pour charger tous les exemples : fichier ManiFich.zip.

Ouvrir un fichier :

const NomFich = 'test.pas';
var F: File;
begin
Assign (F, NomFich); FileMode := 0; Reset (F,1);
Close (F);
end.


Voilà le code de base pour ouvrir un fichier. Explications :
- "File" : type fichier dans lequel est stocké le nom du fichier, la position du curseur de lecture/écriture, ... Mais ces dernières ne sont pas accésibles directement (ce n'est pas un problème allons nous voir plus loin).
- "Assign (F, NomFich);" : procédure qui rentre le nom du fichier (variable string NomFich) dans une variable de type File ou Text (type abordé plus loin).
- "FileMode := 0;" : le fichier sera ouvert dans le mode lecture seule (0). Autre modes : 1= Ecriture seule, 2 = Lecture et écriture.
- "Reset (F,1);" : ouvre le fichier dans le mode binaire (1= longueur d'un enregistrement = mode octet/octet).
- "Close (F)" : Ferme le fichier.

Les erreurs :
    Si le fichier "test.pas" n'existe pas dans le répertoire courant, Turbo Pascal va s'arrêter avec un message d'erreur du genre : Error 2 : File Not Found", et le programme se bloquera en affichant le message suivant : "Runtime error 002 at adress ... : ...", ce qui n'est pas génial. Pour intercepter les erreurs, il faut ajouter la commande "{$I-}" avant "Assign (F, NomFich);" et rajouter "{$I+}" après "Reset (F,1);". La commande "{$I-}" interrompt la détection d'erreur d'entrée/sortie par Turbo Pascal, et "{$I+}" la réactive. Il vaut faudra ensuite lire le code d'erreur après "{$I+}" qui est donné par "IOResult". Si cette variable est nulle, aucune erreur ne s'est produite, sinon elle contient un code d'erreur. Pour décoder ce code, utilisez mon utilitaire Liste en tapant le message d'erreur dans la liste "Runtime error". Les plus courantes : 2-Fichier introuvable, 4-Répertoire introuvable, 5-Fichier protégé en écriture (attribut lecture seule ou disquette protégée contre l'écriture).

Créer un fichier en mode BINAIRE, puis y lire et écrire des données :

const NomFich = 'essai.bin';

var F: File; Erreur: Byte;
a: Byte;
b: Array[1..10] of char;
i: byte;

begin


{ Initialise les données }
for i := 1 to 10 do b := ord('A') +i;
a := 123;

{ Crée le fichier binaire, puis l'ouvre en mode lecture et écriture }
{$I-} Assign (F, NomFich); FileMode := 2; Rewrite (F); Reset (F,1); {$I+}
Erreur := IOResult;

{ Teste les erreurs de création du fichier }
if Erreur<>0 then begin
Writeln ('Création du fichier impossible');
Writeln ('Erreur n°',erreur);
Halt (Erreur);
end;

{ Ecrit un octet }
BlockWrite (F, a, 1);

{ Ecrit 10 caractères }
BlockWrite (F, b, 10);

{ Réouvre le fichier ce qui permet de retourner au début du fichier }
Reset (F, 1);

{ Lit un octet puis l'affiche }
BlockRead (F, a, 1);
WriteLn ('a = ',a);

{ Lit dix caractères puis les affiche }
BlockRead (F, b, 10);
for i := 1 to 10 do WriteLn ('b[',i,'] = ',b[i]);

{ Ferme le fichier }
Close (F);

end.


Voyons un peu les nouveaux éléments :
- "Rewrite (F);" : crée un nouveau fichier.
- "IOResult" : vu plus haut, c'est le code d'erreur d'ouverture du fichier.
- "BlockWrite (F, a, 1);" : Ecrit un (un nombre de type word) octets (de n'importe quel type) dans le fichier F (de type File) à la position actuelle.
- "BlockRead (F, a, 1);" : Lit un (un nombre de type word) octets dans le fichier F (de type File) à la position actuelle et les stocke dans a (de n'importe quel type).

On voit que "Reset (F, 1);" peut être appelé une nouvelle fois pour rouvrir le fichier et donc placer le curseur de lecture (et écriture) au début du fichier.

Créer un fichier en mode TEXTE, y lire et écrire des lignes de texte, puis l'effacer :

const NomFich = 'essai.txt';

var F: Text; Erreur: Byte;
a: char;
txt: String;


begin


{ Initialise les données }
a := 'Z';
txt := 'Salut toi ! Ca va ?';

{ Crée le fichier texte, puis l'ouvre en mode lecture et écriture }
{$I-} Assign (F, NomFich); FileMode := 2; Rewrite (F); Reset (F); {$I+}
Erreur := IOResult;

{ Teste les erreurs de création du fichier }
if Erreur<>0 then begin
Writeln ('Création du fichier impossible');
Writeln ('Erreur n°',erreur);
Halt (Erreur);
end;

{ Ecrit un caractère }
Write (A, txt);

{ Ecrit une ligne }
Writeln (F, txt);

{ Réouvre le fichier ce qui permet de retourner au début du fichier }
Reset (F);

{ Lit un caractère puis l'affiche }
Read (F, a);
WriteLn ('A = ',a);

{ Lit une ligne puis l'affiche }
ReadLn (F, txt);
WriteLn (txt);

{ Ferme le fichier }
Close (F);

{ Efface le fichier }
Erase (F);

end.

Nous remarquons que le code source n'a que peut changer. Voilà ce qui change :
- la variable "F" est maintenant de type "Text".
- lors de l'ouverture, on utilise "Reset (F);" et non plus "Reset (F,1);".
- on écrit grâce au classique : "Write[ln]" sauf qu'il faut à chaque fois préciser la variable fichier au début de la parenthèse.
- on lit grâce au classique : "Read[ln]" sauf qu'il faut à chaque fois préciser la variable fichier au début de la parenthèse.

Pour effacer le fichier, il suffit de le fermer puis d'appeler "Erase (F);".

Fonctions complémentaires pour les fichiers accédés en mode binaire :

=> Attention, ces fonctions ne fonctionnent que pour les fichiers ouverts en mode binaire (Reset F,1) !

const NomFich = 'essai.bin';

var F: File; Erreur: Byte; a: Byte;

begin

{ Ouvre un fichier en mode binaire et lecture seule }
{$I-} Assign (F, NomFich); FileMode := 0; Reset (F,1); {$I+}
Erreur := IOResult;

{ Teste les erreurs d'ouverture du fichier }
if Erreur<>0 then begin
Writeln ('Fichier introuvable');
Writeln ('Erreur n°',erreur);
Halt (Erreur);
end;

{ Affiche la taille du fichier }
Writeln ('Le fichier fait ', FileSize(F), ' octets');

{ Se positionne au milieu du fichier }
Seek (F, FileSize(F) div 2 );

{ Lit un octet puis l'affiche }
BlockWrite (F, b, 10);

{ Réouvre le fichier ce qui permet de retourner au début du fichier }
Reset (F, 1);

{ Lit un octet puis l'affiche }
BlockRead (F, a, 1);
WriteLn ('a = ',a);

{ Ferme le fichier }
Close (F);

end.

Les nouvelles procédures sont :
- "FileSize(F)" : Fonction donnant la taille en octet d'un fichier.
- "Seek (F, FileSize(F) div 2 );" : Positionne le curseur d'écriture/lecture d'un fichier.

Retour aux tutoriels

Par Haypo

Responsable bénévole de la rubrique Pascal : wormful_sickfoot - Contacter par EMail :
Vos questions techniques : forum d'entraide Pascal - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.