APPLICATIONSGAMESLIST ★ EDITO SAVE LOAD RUN AND CO 31 - EXPLOITATION DES FICHIERS ASCII ★

SAVE, LOAD, RUN & CO par G. DUBUS

Ce mois-ci, plein d'astuces utiles pour assurer la maintenance de vos fichiers et de vos répertoires : mettre à jour, renommer, effacer, récupérer, copier.

En prime, quelques conseils déjà connus mais qu'il n'est pas mauvais de rappeler de temps à autre, sur la saisie des listings de la revue et leur utilisation.

EXPLOITATION DES FICHIERS ASCII

Pour lire le contenu d'un fichier ASCII il faut d'abord l'ouvrir en entrée (OPENIN) . Puis il faut entrer les va riables depuis le canal disquette (#9). Il y a pour cela 2 commandes : INPUT et LINEINPUT. La première considère la variable comme terminée dès qu'elle rencontre un délimiteur : virgule, guillemet ou retour-chariot. La seconde ne reconnaît comme délimiteur que le retour-chariot. LINE INPUT est donc à préférer pour les variables alphanumériques, qui peuvent ainsi inclure virgules et guillemets.
En fin de lecture, on referme le fichier en entrée (CLOSEIN).

Pour lire le fichier DONNEES et l'afficher, voici le programme LECTURE :

10 OPENIN"DONNEES"
20 LINE INPUT#9,C$:PRINT C$
30 INPUT#9,R!:PRINT R!
40 INPUT#9,E%:PRINT E%
50 CLOSEIN

Et si on ne connaît pas le nombre et le type des variables enregistrées ? Alors on les entre par LINE INPUT dans une variable alphanumérique, une à une jusqu'à la fin du fichier (EOF) :

10 OPENIN"DONNEE$"
20 WHILE NOT EOF
30 LINE INPUT#9,A$:PRINT A$
40 WEND
50 CLOSEIN

La boucle des lignes 20 à 40 exécute la ligne 30 tant qu'on n'a pas atteint la marque de fin de fichier (EOF = code ASCII 26). Traduit en clair, cela donne ceci :
-  La condition "Ce n'est pas la fin du fichier" est-elle vraie ? Oui (20).
- Alors on lit le fichier jusqu'au premier retour-chariot, on affecte ce qui est lu à la variable AS, qu'on affiche à l'écran (30).
- L'instruction de fin de boucle (40) renvoie en tête de boucle (20).

Dès qu'on arrive en fin de fichier, la condition de la ligne 20 n'est plus vraie, et on saute à la ligne 50 (on sort de la boucle).
Si cela vous surprend qu'une variable numérique enregistrée dans un fichier ASCII puisse être affectée, à la lecture de ce fichier, à une variable alphanumérique, souvenez-vous qu'un fichier ASCII, par définition, ne contient que des caractères. Dans le programme LECTURE, les instructions INPUT#9,RI et INPUT#9,E% transforment la représentation ASCII de ces variables en valeurs numériques, affectées ensuite à RI et à E%. PRINT et PRINT#9 assurent la transformation inverse.

Si le fichier DONNEES, quelle que soit son extension, est un fichier de type Basic, une tentative de chargement par OPENIN donne le message d'erreur File type error, sauf si c'est du Basic sauvé en ASCII.

Pour modifier une ou plusieurs des variables enregistrées dans DONNEES, il suffit de le charger par le programme LECTURE, puis de changer la ou les valeurs en mémoire. Exemple : vous tapez E%=123 (+ENTER). Puis la commande CHAIN"ECRITURE" sauve à nouveau les variables, sous le même nom de fichier. La version précédente de DONNEES se retrouve alors avec l'extension BAK.

Cet exemple était volontairement simpliste (il y avait seulement 3 variables, de types différents). Dans un vrai fichier ASCII de données, par exemple un carnet
d'adresses (très original I), vous trouvez des ENREGISTREMENTS rangés à la suite ; chaque enregistrement comprend un certain nombre de CHAMPS (ou ZONES) : ce sont les variables. Exemple :

  • champ 1 : Nom$ (alphanumérique)
  • champ 2 : Prenom$ (alphanumérique)
  • champ 3 : Age% (numérique entier)
  • champ 4 : Adresse$ (alphanumérique)

Dans chaque enregistrement, correspondant à une ficher complète, les champs sont toujours lus ou écrits dans le même ordre : c'est la STRUCTURE du fichier.

Le modification d'un enregistrement de cet exemple de carnet d'adresses (fichier CARNET) est facile, en sachant qu'il est possible d'ouvrir simultanément 2 fichiers ASCII, l'un en lecture et l'autre en écriture, à condition que les désignations soient différentes.

  • Renommer CARNET en CARNET.BAK
  • Ouvrir CARNET.BAK en lecture et CARNET en écriture
  • Boucle : tant que ce n'est pas la fin du fichier
  • lire les 4 variables de l'enregistrement courant
  • les afficher
  • demander à l'utilisateur s'il veut modifier l'enregistrement
  • si oui, entrer les nouvelles valeurs
  • écrire les 4 variables
  • fin de boucle : avancer d'un enregistrement, et retour en tête de boucle
  • Fermer les 2 fichiers
  • Effacer CARNET.BAK

Cette description pas à pas des opérations s'appelle un ALGORITHME.

Voici le programme MISAJOUR correspondant :

10 ùREN,"CARNET.BAK","CARNET."
20 OPENIN"CARNET.BAK":OPENOUT"CARNET"
30 WHILE NOT EOF
40 UNE INPUT#9,Nom$:PRINT"Nom : ";Nom$
50 UNE INPUT#9,Prenom$:PRINT"Prénom : ";Prenom$
60 UNE INPUT#9,Age%:PRINT"Age : ";Age%
70 UNE INPUT#9,Adresse$:PRINT"Adresse : ";Adresse$
80 INPUT"Voulez-vous modifier l'enregistrement O/N";A$
90 IF UPPER$(A$)="0" THEN LINE INPUT"Nom ";Nom$:LINE INPUT"Prénom ";Prenom$:INPUT"Age ";Age%:UNE INPUT'Adresse ";Adresse$
100 PRINT#9,Nom$:PRINT#9,Prenom*:WRITE#9,Age%:PRINT#9,Adresse$
110 WEND
120 CLOSEIN:CLOSEOUT
130 ùERA,"CARNET.BAK"

Si la réponse à la question de le ligne 80 est autre que *0", alors on passe directement à la ligne 100, qui recopie dans ce cas les variables non modifiées.

Pour supprimer l'enregistrement courant, ajoutez les 2 lignes suivantes :

74 INPUT"Voulez-vous supprimer l'enregistrement O/N";A$
76 IF UPPER$(A$)="O" THEN 110

Si vous répondez "O". l'enregistrement courant n'est pas recopié.
Et pour Insérer un nouvel enregistrement juste après l'enregistrement courant ? Les 2 lignes à ajouter sont :

104 INPUT"Voulez-vous ajouter un enregistrement O/N";A$
106 IF UPPER$(A$)="0" THEN 90

Un petit tuyau bien utile : à la lecture de chaque enregistrement, la valeur des variables change. Pour les variables alphanumériques, les nouvelles valeurs n'écrasent pas les anciennes, mais viennent se placer à côté en mémoire. L'accumulation des anciennes valeurs non récupérables, dites "valeurs mortes", peut à la longue saturer la mémoire. Le malaise, c'est que le système attend le dernier moment pour faire le grand ménage, qui bloque toute autre opération ; cela peut durer un bon quart d'heure... La commande PRINT FRE("") force le coup de balai à là demande, et affiche aussitôt après le nombre d'octets disponibles en mémoire. La ruse, c'est de lancer cette commande automatiquement à de brefs intervalles ; le temps d'arrêt dû au nettoyage est alors imperceptible. Pour éviter l'affichage de la mémoire disponible, on bloque l'affichage en début de commande, et on le rétablit à la fin. Ce qui donne :

5 EVERY 1000,0 GOSUB 10000
10000 PRINT CHR$(21);FRE("");CHR$(6);:RETURN

A Suivre … DEUX INSTUCTIONS BIEN UTILES : ùREN et ùERA

SAVE, LOAD, RUN & CO , G. DUBUS , CPC Infos n°29

Page précédente : Edito Save Load Run And Co 2

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 107 millisecondes et consultée 1194 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.