LES ENTREES / SORTIES


SUR LA CONSOLE

La procedure WRITELN permet d'afficher des resultats sur l'ecran. Les differents arguments sont affiches les uns apres les autres sur la meme ligne. Le curseur est ensuite automatiquement mis en debut de ligne suivante. Pour eviter ceci, on peut utiliser WRITE, qui s'utilise comme WRITELN mais le curseur est laisse derriere le dernier caractere. De meme, READ fonctionne comme READLN, excepte le curseur qui reste sur la ligne.

WRITE et WRITELN acceptent le "formatage" : on peut imposer le nombre de caracteres utilises pour chaque variable. Soit I entier, R reel :

WRITE(I:5,' ',R:7:2) ecrira I sur 5 caracteres, et R sur 7 caracteres dont 2 apres la virgule. Si les valeurs sont trop petites pour entrer dans le format, des blancs sont mis devant. Si elles sont trop grandes, le format est ignore.

SUR FICHIER

Un fichier est un ensemble de donnees, ecrites sur un "support" lisible par l'ordinateur (disquette, cartes perforees,...), et regroupees sous un nom. Un fichier peut contenir des caracteres (fichier de textes), des programmes, des valeurs (fichier de donnees).

Etudions l'exemple suivant :

  program recopier(input,output);
  var fic_ent,fic_sor : file of real;
      x:real;
  begin
    assign(fic_ent,'fichier1'); (* non standard *)
    reset(fic_ent);
    assign(fic_sor,'fichier2'); (* non standard *)
    rewrite(fic_sor);
    while not eof(fic_ent) do begin
      read(fic_ent,x);
      write(fic_sor,x)
    end;
    close(fic_ent);
    close(fic_sor)
  end.

On declare les fichiers par :

VAR nomfic : FILE OF type_du_contenu

Un fichier peut contenir des elements de n'importe quel type (aussi complique soit-il, meme tableaux), mais tous les enregistrements du fichier doivent etre du meme type.

Avant d'utiliser le fichier, il faut relier son identificateur au nom effectif du fichier par ASSIGN. Ici, FIC_ENT correspondra a un fichier qui aura pour nom FICHIER1 sur la disquette. ASSIGN n'est pas une fonction standard, d'autres compilateurs utilisent OPEN.

Puis il faut preciser si l'on va ecrire ou lire sur le fichier par RESET ou REWRITE. Ceci positionne en debut du fichier.

On ecrit dans le fichier par WRITE(nomfic,liste_des_variables). Idem pour READ.

Il ne faut pas oublier de fermer le fichier (close) quand on n'en a plus besoin. CLOSE est necessaire egalement si l'on veut refaire un nouvel ASSIGN sur le meme fichier.

La fonction standard EOF(nomfic) est TRUE quand on arrive en fin de fichier (End Of File).

Rq : Lors de la definition initiale du Pascal, on devait ouvrir les fichiers avant d'appeler le programme. Les fichiers etaient des variables globales declarees en arguments du programme (et donc passes du systeme d'exploitation au programme). Nous les declarons maintenant DANS le programme, les deux seuls fichiers donnes en parametres du programme restant INPUT et OUTPUT.

LES FICHIERS DE TEXTE

Le principal probleme des fichiers precedents est que tous les enregistrements sont du meme type. De plus ils ne sont pas directement imprimables ni visibles par un traitement de textes ou un programme ecrit dans un autre langage. On y remedie par les fichiers texte (aussi appeles fichiers formates), declares par :

VAR nomfic:TEXT

Ce sont des fichiers de caracteres, et se comportent comme l'ecran ou le clavier (qui sont d'ailleurs les fichiers text INPUT et OUTPUT utilises automatiquement si on ne precise pas de nomfic dans les READ<ln> et WRITE<ln> ). On a aussi les memes limitations (ecriture d'entiers, reels et chaines de caracteres seulement).

ex : program lire(input,output,fic);
     type chaine=array[1..80]of char;
     var fic:text;
         ligne:chaine;
     begin
       assign(fic,'texte');
       rewrite(fic);
       writeln('tapez votre texte, il sera enregistre dans le fichier TEXTE ');
       writeln('tapez FIN pour arreter');
       repeat
         readln(ligne);
         writeln(fic,ligne)
       until ligne='FIN';
       close(fic)
     end.

EXTENSIONS NON STANDARD

ACCES DIRECT

La plupart des compilateurs acceptent la procedure SEEK(nomfic,position) qui permet de se positionner n'importe ou dans le fichier (sans etre oblige de lire dans l'ordre tous les elements). Ceci n'est evidement possible que si la taille des elements est constante, donc pour tous les fichiers exceptes ceux du type TEXT, puisque les lignes n'y sont pas de longueur constante. L'acces a une information est donc beaucoup plus rapide (a condition de connaitre sa position) On appelle ceci l'ACCES DIRECT a un fichier, par opposition a l' ACCES SEQUENTIEL prevu en standard.

SEEK est d'autant plus utile que RESET autorise la lecture et l'ecriture des fichiers a acces direct (REWRITE par contre efface tout le contenu du fichier, on ne peut donc plus qu'ecrire).

IMPRIMANTE

Pour acceder a l'imprimante, deux solutions:

* ouvrir un fichier TEXT sur disque, le remplir, et lorsque le programme est termine le copier (par le DOS) sur imprimante

* utiliser un nom de fichier predefini correspondant a l'imprimante. En Turbo, c'est LST. ex : writeln(lst, 'COUCOU'). LST n'a pas besoin d'etre ouvert en TURBO (tout comme OUTPUT).

AUTRES

Turbo Pascal permet beaucoup d'autres operations sur les fichiers (Delete, Rename, Path...) qui ne sont pas standard. Si vous les utilisez, rappelez vous qu'elles ne fonctionneront pas avec un autre compilateur (Microsoft par ex) ni sous un autre systeme d'exploitation (Unix par ex).

EXERCICE (fichier) Ecrire la procedure qui lit le fichier "annuaire" afin de rendre operationnel l'exercice tel. Modifier ce programme pour permettre l'entree et la modification du fichier annuaire.