LES FICHIERS DE DONNEES
LISTE DES MOTS CLÉS SPÉCIFIQUES.
Mots clés du BBC BASIC.
# : en tant que préfixe, indique un numéro de canal de fichier.
BGET # : retourne les données du fichier un octet à la fois.
BPUT # : écrit les enregistrements dans un fichier en ajoutant un Saut de Ligne (LF).
CLOSE # : ferme un fichier.
EOF # : retourne -1 si le pointeur a atteint la fin du fichier.
EXT # : retourne ou définit la longueur totale du fichier.
GET$# : retourne les enregistrements terminés par CR, LF ou NUL.
GET$# ... TO : retourne les enregistrements terminés délimiteur spécifié et/ou CR et LF.
GET$# ... BY : retourne les données du fichier avec une taille définie.
INPUT # : retourne les enregistrements terminés par un Retour Chariot (CR).
OPENIN() : ouvre un fichier en lecture et retourne le numéro de canal du fichier.
OPENOUT() : créer un fichier, l'ouvre en écriture et retourne le numéro de canal du fichier.
OPENUP() : ouvre un fichier en lecture/écriture et retourne le numéro de canal du fichier.
PRINT # : écrit des enregistrements dans un fichier en ajoutant un Retour Chariot (CR).
PTR # : retourne ou modifie la position du pointeur dans le fichier.
READ # : identique à INPUT#.
Variables système du BBC BASIC.
@dir$ : le répertoire à partir duquel le programme a été chargé.
@lib$ : le répertoire contenant les fichiers de la bibliothèque BBC BASIC.
@tmp$ : le répertoire temporaire.
@usr$ : le répertoire spécifique à l'utilisateur actuel.
Module de la bibliothèque du BBC BASIC.
filedlg.bbc : propose des fonctions pour sélectionner un fichiers dans un explorateur de fichiers.
GÉNÉRALITÉS.
Dans un fichier de données, un enregistrement est une suite de données, des caractères ou des valeurs binaires, terminée par un symbole de Retour Chariot (CR ou CHR$(13)) ou un Saut de Ligne (LF ou CHR$(10)) selon l'instruction utilisée pour son enregistrement.
Il est possible, dans un même fichier de données, d'enregistrer des chaines de caractères et des valeurs numériques, mais cela est vivement déconseillé. Il est plutot recommandé de ne créer que des fichiers de chaines de caractères, en convertissant les valeurs numériques avant l'enregistrement. Le manuel du BBC BASIC pour SDL 2.0 précisant : "N'oubliez pas qu'avec BBC BASIC, le format du fichier est entièrement sous votre contrôle."
LOCALISATION DES FICHIERS.
Un fichier de données est identifié sur un système informatique par son nom. Un nom de fichier peut être exprimé de façon :
- absolue, indiquant le support, le chemin d'accès, le nom et l'extension du fichier,
- relative, indiquant son nom et son extension, il est supposé se trouver dans un dossier par défaut.
La syntaxe à utiliser pour identifier le support et le chemin d'accès, de même que les contraintes pour nommer un fichier et son extension, dépendent du système d'exploitation sur lequel se trouve le fichier de données.
Il est possible de connaître les différents répertoires par défaut utilisés par le BBC BASIC pour SDL 2.0 grâce aux variables systèmes suivantes :
- @dir$ : le répertoire à partir duquel le programme a été chargé ;
- @lib$ : le répertoire contenant les fichiers de la bibliothèque BBC BASIC ;
- @tmp$ : le répertoire temporaire ;
- @usr$ : le répertoire spécifique à l'utilisateur actuel.
On pourra donc utiliser la variable système @usr$ pour connaitre, ou modifier, le répertoire de travail actuel.
PRINT @usr$
retourne :
sous linux : /home/usser/.local/share/BBCBasic/
sous Windows : C:\Users\nerd\AppData\Roaming\BBCBasic\
Pour indiquer de façon sure, au programme, où se trouve le fichier de données avec lequel on souhaite travailler, on pourra donc identifier le fichier de façon absolue grâce à la syntaxe :
- kfichier$ = @usr$ + "mon fichier.txt", pour le placer dans le dossier de travail par défaut ;
- kfichier$ = @dir$ + "mon fichier.txt", pour le placer dans le dossier où se trouve le programme ;
où mon fichier sera le nom de votre fichier.
CRÉATION D'UN FICHIER DE DONNÉES.
Pour créer un nouveau fichier de données, on utilise la fonction OPENOUT(). L'appel de cette fonction va créer un nouveau fichier sur le support désigné, en suivant le chemin d'accès donné, avec le nom indiqué, si aucune extension n'est précisée, BBC BASIC ajoutera .BBC par défaut. Si un fichier de même nom existe déjà à cet emplacement, il sera écrasé, détruit.
Ensuite, la fonction OPENOUT() retourne un nombre entier qui indique le canal d'accès du fichier. Cette référence sera exigée pour chaque enregistrement dans le fichier. Il faudra donc placer cette valeur dans une variable, du type octet (&) de préférence. Il est vivement conseillé de nommer cette variable du même nom, avec le suffixe &, que celui utilisé, avec le suffixe $, pour identifier le fichier, surtout si le programme doit manipuler plusieurs fichiers.
Pour terminer l'utilisation du fichier, il est indispensable d'utiliser l'instruction CLOSE #. Cette instruction ferme et libère le canal de communication et finalise l'enregistrement des données sur le support. La syntaxe CLOSE #0 fermera tous les fichiers actuellement ouverts.
kfichier$ = @dir$ + "Tester.txt"
kfichier& = OPENOUT( kfichier$ )
CLOSE #kfichier&
PRINT "Le fichier " ; kfichier$ ; " a ete cree et ferme."
PRINT "Son numero de canal etait " ; kfichier&
END
Note. Il est important de fermer proprement un fichier, avec l'instruction CLOSE #, dès que son utilisation n'est plus requise par le programme. De même, l'instruction END finalisera l'enregistrement des données sur le support non-volatil.
Vous pouvez vérifier la création du fichier en consultant votre explorateur de fichiers.
Si le fichier est déjà ouvert en mode création avec la fonction OPENOUT(), ou en mode lecture/écriture avec la fonction OPENUP(), son accès sera refusé. Dans ce cas,la fonction OPENOUT() retournera 0 comme numéro de canal, et aucune manipulation ne pourra être réalisée avec ce canal. En effet, si un fichier est déjà ouvert en écriture, avec OPENOUT() ou OPENUP(), il ne pourra pas être ouvert avec un nouvel appel de l'une ou l'autre de ces fonctions.
kfichier$ = @dir$ + "Tester.txt"
kcanal_A& = OPENOUT( kfichier$ )
kcanal_B& = OPENOUT( kfichier$ )
CLOSE #0 : REM --- Ferme tous les fichier ouvert
PRINT kcanal_A&
PRINT kcanal_B&
END
retourne (par exemple) :
5
0
Note : Le BBC BASIC ne propose pas d'instructions permettant de savoir si un fichier est ouvert ou pas. Donc, pour connaitre la disponibilité d'un fichier, on devra, par exemple, créer une procédure personnalisée de gestion des erreurs qui sera appelée si une erreur de type "Invalid channel" (code 222) est détectée.
REM --- Initialisation ---
ON ERROR PROC_Erreur222
REM --- Erreur : Fichier non ouvert (code 222) --
DEF PROC_Erreur222 : REM - Ficher non ouvert
PRINT "Fichier non ouvert"
END
ENDPROC
ENREGISTREMENT STANDARD DES DONNÉES AVEC UN RETOUR CHARIOT (RC).
Pour enregistrer des données dans un fichier existant et ouvert en écriture, on utilise l'instruction PRINT #, à laquelle on associe le numéro du canal adéquat. L'instruction ajoute à la suite de chaque enregistrement un caractère de Retour Chariot (CR ou CHR$(13)) puis attribut au pointeur la valeur de l'octet suivant à la fin du fichier.
kfichier$ = @dir$ + "Tester.txt"
kfichier& = OPENOUT( kfichier$ )
FOR kvaleur = 3 TO 7
kvaleur$ = STR$( kvaleur )
kchaine$ = ""
FOR kchaine = 1 TO kvaleur
kchaine$ += "- " + STR$( kvaleur ) + " -"
NEXT kchaine
PRINT #kfichier&, kchaine$
NEXT kvaleur
CLOSE #kfichier&
PRINT "Operation terminee ..."
END
Vous pouvez vérifier le résultat en ouvrant le fichier, à l'aide du bloc-notes de votre système d'exploitation. Cela devrait ressembler à ceci :
- 3 -- 3 -- 3 -
- 4 -- 4 -- 4 -- 4 -
- 5 -- 5 -- 5 -- 5 -- 5 -
- 6 -- 6 -- 6 -- 6 -- 6 -- 6 -
- 7 -- 7 -- 7 -- 7 -- 7 -- 7 -- 7 -
Il n'est pas obligatoire que les données se trouvent dans une variable, elles peuvent être exprimées de manière brute. Il est aussi possible d'écrire plusieurs enregistrements avec une seule instruction PRINT #. Les données numériques seront converties dans le format le plus adéquat pour une utilisation avec le BBC BASIC.
kfichier$ = @dir$ + "Tester.txt"
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC"
PRINT #kfichier&, "BBC BASIC" , "pour SDL" , 2.0
PRINT #kfichier&, kfichier$ , kfichier&
CLOSE #kfichier&
PRINT "Operation terminee ..."
END
Vous pouvez vérifier le résultat en ouvrant le fichier, à l'aide du bloc-notes de votre système d'exploitation. Cela devrait ressembler à ceci :
BBC BASIC
BBC BASIC
pour SDL
▯.
D:\Programmes portables\BBC Basic\examples\Tester.txt
▯
Avec l'instruction PRINT # :
- les chaînes de caractères sont écrites telles quelles plus un Retour Chariot (CR) ;
- les valeurs numériques sont écrites sous forme de :
- 5 octets de données binaires ou ;
- 8 octets de données binaires en mode *FLOAT6.
ENREGISTREMENT DES DONNÉES AVEC UN SAUT DE LIGNE (LF).
Il est aussi possible d'utiliser l'instruction BPUT # pour enregistrer des données dans le fichier. L'instruction BPUT # enregistre une chaine de caractères ou un seul octet à la fois. Puis le pointeur est déplacé d'un rang et le caractère suivant est enregistré. À la fin de l'enregistrement, l'instruction BPUT #, place un caractère Saut de Ligne (LF ou CHR$10) ou rien à la suite de chaque enregistrement, à la place de Retour Chariot (RC) avec PRINT #.
Pour enregistrer des chaine de caractères, on indiquera cette chaine de caractères en deuxième paramètre, comme pour l'instruction PRINT #. Par défaut BPUT # place un Saut de Ligne (LF) à la suite de la chaine de caractères, mais ce comportement peut être annulé si l'on place un point-virgule (;) après la chaine de caractères à sauvegarder.
kfichier$ = @dir$ + "Tester.txt"
kfichier& = OPENOUT( kfichier$ )
BPUT #kfichier&, "BBC BASIC"
BPUT #kfichier&, "Mon BBC BASIC " ;
BPUT #kfichier&, "pas a pas"
BPUT #kfichier&, "par origine NERD"
CLOSE #kfichier&
PRINT "Operation terminee ..."
END
Vous pouvez vérifier le résultat en ouvrant le fichier, à l'aide du bloc-notes de votre système d'exploitation. Cela devrait ressembler à ceci :
BBC BASIC
Mon BBC BASIC pas a pas
par Origine NERD
Si on utilise la fonction BPUT # pour enregistrer des valeurs numériques, en plaçant cette valeur comme second argument, c'est son octet le moins significatif qui est écrit dans le fichier. La valeur de l'enregistrement sera donc toujours une valeur entre 0 et 256, quelle que soit la valeur numérique indiquée pour l'enregistrement.
kfichier$ = @dir$ + "Tester.txt"
kfichier& = OPENOUT( kfichier$ )
FOR kvaleur = 1 TO 1000 STEP 25 : BPUT #kfichier&, kvaleur : NEXT kvaleur
CLOSE #kfichier&
PRINT "Operation terminee ..."
END
Vous pouvez vérifier le résultat en ouvrant le fichier, à l'aide du bloc-notes de votre système d'exploitation. Cela devrait ressembler à ceci : 3Le~Ч░╔т√-F_xСк├▄ї'@YrЛд╜╓я!:SlЕЮ╖╨щ4MfШ▒╩у№.G`yТл─▌Ў(AZsМе╛╫Ё ";TmЖЯ╕. En effet, chaque valeur enregistrée étant comprise en 0 et 255, elles peuvent être représentées par un caractère ASCII.
Notez, qu'il n'y a pas de Saut de Ligne (LF) placé entre les valeurs enregistrées.
De plus, on pourra utiliser l'instruction BPUT # avec une chaine vide ("") comme second argument, à la suite d'un enregistrement avec l'instruction PRINT #, pour placer un Saut de Ligne (LF) à cet enregistrement. Cette technique, permet d'assurer la compatibilité avec d'autres langages informatiques qui attendent un Saut de Ligne comme délimiteur d'enregistrement, si votre fichier devait être utilisé avec ceux-ci.
kfichier$ = @dir$ + "Tester.txt"
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC pour SDL 2.0"
BPUT #kfichier&, ""
PRINT #kfichier&, "Mon BBC BASIC Pas a Pas"
BPUT #kfichier&, ""
PRINT #kfichier&, "par Origine NERD"
BPUT #kfichier&, ""
CLOSE #kfichier&
PRINT "Operation terminee ..."
END
Vous pouvez vérifier le résultat en ouvrant le fichier, à l'aide du bloc-notes de votre système d'exploitation. Cela devrait ressembler à ceci :
BBC BASIC
Mon BBC BASIC pas a pas
par Origine NERD
AJOUTER DES ENREGISTREMENTS.
Pour ajouter des enregistrements dans un fichier de données existant, il faut d'abord l'ouvrir en mode lecture/écriture avec la fonction OPENUP(), afin d'obtenir son numéro de canal, et le mémoriser dans une variable. Puis, on utilisera l'instruction PRINT # ou l'instruction BPUT # avec les mêmes modalités que ci-dessus.
La pseudo-variable PTR #, suivie du numéro du canal associé au fichier, retourne la position, le rang, du prochain octet qui sera lu ou écrit dans le fichier. La valeur de la pseudo-variable PTR # peut être modifiée "manuellement" par le programme.
Note : l'utilisation de PTR # a pour effet secondaire de vider le tampon du fichier associé.
La valeur de la pseudo-variable PTR # peut être augmentée ou diminuée, mais toute valeur en dehors de la taille du fichier provoquera une erreur. Pour connaitre la taille, la longueur, d'un fichier, on utilise l'instruction EXT # suivie du numéro du canal associé au fichier dont on souhaite connaitre la longueur. Si le fichier n'est pas, ou n'est plus, ouvert une erreur sera retournée.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT EXT #kfichier&
PRINT #kfichier&, "BBC BASIC SDL 2.0"
PRINT EXT #kfichier&
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT EXT #kfichier&
PRINT #kfichier&, "Origine NERD"
PRINT EXT #kfichier&
CLOSE #kfichier&
PRINT EXT #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
0
18
42
55
Invalide channel
Note : l'instruction EXT # permet aussi de définir, ou de modifier, la taille total d'un fichier avec la syntaxe EXT #kfichier& = longueur, où longueur doit être un INTERGER (type %) positive.
Pour ajouter de nouveaux enregistrements, à la fin du fichier, il faut placer le pointeur à la suite du dernier caractère du fichier grâce à la pseudo-variable PTR # et à l'instruction EXT #, sinon les enregistrements commenceront à l'emplacement 0, ou là où se trouve le pointeur, et remplaceront les données présentes dans le fichier.
REM --- Initialisation ----
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "CREATION du fichier pour tester ..."
CLOSE #kfichier&
REM --- Sans déplacement du pointeur ---
kfichier& = OPENUP( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0 "
CLOSE #kfichier&
REM --- Avec déplacement du pointeur ---
kfichier& = OPENUP( kfichier$ )
PTR #kfichier& = EXT #kfichier&
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Fin de l'exemple ---
PRINT "Operation terminee ..."
END
Vous pouvez vérifier le résultat en ouvrant le fichier, à l'aide du bloc-notes de votre système d'exploitation. Cela devrait ressembler à ceci :
BBC BASIC SDL 2.0
pour tester ...
Mon BBC BASIC pas a pas
Origine NERD
Comme on le constate, une partie du premier enregistrement a été effacée et remplacée par le second enregistrement, qui est plus court, ce qui fait que la fin du premier enregistrement est maintenant le deuxième enregistrement.
Si l'on a besoin de placer un Saut de Ligne (LF) comme délimiteur, on pourra, bien sûr, utiliser l'instruction BPUT # à la place de l'instruction PRINT # pour ajouter, ou modifier, des enregistrements dans un fichier de données.
LECTURE DES ENREGISTREMENTS STANDARDS.
Pour lire des enregistrements présents dans un fichier de données existant, il faut d'abord l'ouvrir en mode lecture seule avec la fonction OPENIN(), ou en mode lecture/écriture avec la fonction OPENUP(), afin d'obtenir son numéro de canal, et de le mémoriser dans une variable.
La fonction OPENIN() ouvre le fichier en lecture seulement. Il ne sera pas possible de modifier les enregistrements ni d'en ajouter. On l'utilisera pour s'assurer qu'il n'y aura pas de modification au fichier lors de son utilisation.
La fonction OPENUP() ouvre le fichier en lecture et en écriture. En plus de lire les enregistrements du fichier, il sera possible de les modifier et/ou d'en ajouter. On l'utilisera pour mettre à jour les données du fichier lors de son utilisation.
On pourra utiliser plusieurs fonctions OPENIN() simultanément pour ouvrir un même fichier pour lire ses données. Par contre, les fonctions OPENOUT() et OPENUP() ne peuvent être associées à un fichier que s'il n'est pas déjà ouvert en écriture.
Notez que le numéro de canal attribué au fichier à sa création et ceux qui lui seront associés lors de ses utilisations suivantes peuvent être différents.
Ensuite, on utilisera l'instruction INPUT #, ou READ #, pour lire les enregistrements les uns après les autres.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Lecture des enregistrements avec OPENIN ---
kfichier& = OPENIN( kfichier$ )
INPUT #kfichier&, kdonnee$ : PRINT kdonnee$
INPUT #kfichier&, kdonnee$ : PRINT kdonnee$
INPUT #kfichier&, kdonnee$ : PRINT kdonnee$
CLOSE #kfichier&
REM --- Lecture des enregistrements avec OPENUP ---
kfichier& = OPENUP( kfichier$ )
INPUT #kfichier&, kdonnee$ : PRINT kdonnee$
INPUT #kfichier&, kdonnee$ : PRINT kdonnee$
INPUT #kfichier&, kdonnee$ : PRINT kdonnee$
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL
Mon BBC BASIC pas a pas
Origine NERD
BBC BASIC SDL
Mon BBC BASIC pas a pas
Origine NERD
Il est possible de lire plusieurs enregistrements avec une seule instruction INPUT #, ou READ #, en séparant les variables par une virgule. Attention, les types des variables doivent correspondre aux types des données lues.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL "
PRINT #kfichier&, 2.0
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Lecture des enregistrements ---
kfichier& = OPENIN( kfichier$ )
INPUT #kfichier&, ka$ , kb , kc$ , kd$
CLOSE #kfichier&
PRINT ka$ ; kb
PRINT kc$
PRINT kd$
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL 2.0
Mon BBC BASIC pas a pas
Origine NERD
Rappel. La pseudo-variable PTR #, suivie du numéro du canal associé au fichier, retourne la position du prochain octet qui sera lu ou écrit dans le fichier.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Lecture des enregistrements ---
kfichier& = OPENIN( kfichier$ )
FOR kenregistrement = 1 TO 3
kpointeur = PTR #kfichier&
INPUT #kfichier&, kdonnee$
PRINT kdonnee$ ; " commence a la position " ; kpointeur
NEXT kenregistrement
PRINT "Fin du fichier a la position " ; PTR #kfichier&
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL 2.0 commence a la position 0
Mon BBC BASIC pas a pas commence a la position 18
Origine NERD commence a la position 42
Fin du fichier a la position 55
Rappel. La valeur de la pseudo-variable PTR # peut être modifiée "manuellement" par le programme. Dans ce cas, l'instruction INPUT # retournera tous les caractères depuis la nouvelle position du pointeur jusqu'au caractère CR (Retour Chariot) suivant.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Lecture des enregistrements ---
kfichier& = OPENIN( kfichier$ )
FOR kpointeur = 0 TO 55 STEP 10
PTR #kfichier& = kpointeur
INPUT #kfichier&, kdonnee$
PRINT kdonnee$ ; " est compris entre " ; kpointeur ; " et " ; PTR #kfichier&
NEXT kpointeur
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL 2.0 est compris entre 0 et 18
SDL 2.0 est compris entre 10 et 18
n BBC BASIC pas a pas est compris entre 20 et 42
C pas a pas est compris entre 30 et 42
s est compris entre 40 et 42
NERD est compris entre 50 et 55
Il sera ainsi possible de controler si la position du pointeur ne se situe pas en dehors du fichier.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Lecture du fichier ---
kfichier& = OPENIN( kfichier$ )
WHILE PTR #kfichier& < EXT #kfichier&
INPUT #kfichier&, kdonnee$
PRINT kdonnee$ ; " : " ; PTR #kfichier& ; " sur " ; EXT #kfichier&
ENDWHILE
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL 2.0 : 18 sur 55
Mon BBC BASIC pas a pas : 42 sur 55
Origine NERD : 55 sur 55
Néanmoins pour savoir si le pointeur est placé en dehors du fichier, on utilisera de préférence l'instruction EOF #, suivie du numéro de canal associé au fichier, qui retourne -1 si le pointeur se trouve en dehors du fichier.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Lecture du fichier ---
kfichier& = OPENIN( kfichier$ )
REPEAT
INPUT #kfichier&, kdonnee$
PRINT kdonnee$ ; " : " ; EOF #kfichier&
UNTIL EOF #kfichier&
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL 2.0 : 0
Mon BBC BASIC pas a pas : 0
Origine NERD : -1
LECTURE DES ENREGISTREMENTS OCTET PAR OCTET.
Pour lire les données enregistrées dans un fichier, on peut aussi utiliser l'instruction BGET # qui retourne la valeur de l'octet, c'est-à-dire une valeur comprise entre 0 et 255, qui se trouve actuellement à la position du pointeur, puis le pointeur est incrémenté d'une position vers la fin du fichier.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC"
CLOSE #kfichier&
REM --- Lecture du fichier ---
kfichier& = OPENIN( kfichier$ )
REPEAT
kdonnee = BGET #kfichier&
PRINT kdonnee , " " , CHR$(kdonnee)
PRINT " -- " , CHR$(BGET #kfichier&)
UNTIL EOF #kfichier&
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
66 B
66 B
67 C
32
66 B
65 A
83 S
73 I
67 C
13
LECTURE DES ENREGISTREMENTS DE TYPES INCERTAINS.
L'instruction GET$# permet de lire les enregistrements présents dans un fichier de données. Contrairement à INPUT #, et à READ #, l'instruction GET$# lit une chaine de caractère jusqu'à un Retour Chariot (RC), un Saut de Ligne (LF) ou NUL, voire un caractère désigné par le programme, seul ou associé avec RC et/ou LF.
On utilisera principalement l'instruction GET$# pour lire des fichiers de données extérieurs ou exportés et dont le délimiteur n'est pas connu ou incertain. De plus, si le fichier de données ne comporte pas le ou l'un des symbole délimiteurs, après 65535 caractères (octets), l'instruction retournera une chaine de 65535 caractères, alors que les instructions INPUT # ou READ # retourneront une chaine vide.
Notez que le symbole # doit être collé au symbole $ pour que la commande soit reconnue par le BBC BASIC, contrairement à INPUT et READ qui admettent un espace avant le #.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
BPUT #kfichier&, "BBC BASIC SDL 2.0"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Lecture du fichier ---
kfichier& = OPENIN( kfichier$ )
REPEAT
kdonnee$ = GET$#kfichier&
PRINT kdonnee$
UNTIL EOF #kfichier&
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL 2.0
Mon BBC BASIC pas a pas
Origine NERD
Pour modifier le caractère de retour, on utilisera la syntaxe GET$#kcanal& TO kcode% où kcanal& est le numéro du canal associé au fichier et kcode% le code ASCII du caractère servant de limitateur des enregistrements. kcode% doit être un nombre entier compris entre 32 et 255, exprimé en décimal ou sous sa forme hexadécimal. Par exemple, si l'on souhaite que la fin d'un enregistrement soit identifiée par le caractère | (trait vertical), dont le code ASCII est 124 en décimal ou &7C en hexadécimal, on écrira l'une des syntaxes : GET$#kcanal& TO 124 ; GET$#kcanal& TO ASC ( "|" ) ou encore GET$#kcanal& TO &7C.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC|SDL 2.0|"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD|"
CLOSE #kfichier&
REM --- Lecture du fichier ---
kfichier& = OPENIN( kfichier$ )
REPEAT
PRINT GET$#kfichier& TO &7C
UNTIL EOF #kfichier&
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC
SDL 2.0
Origine NERDC pas a pas
Notez que le caractère | n'apparait pas, mais que le Retour Chariot (CR) du deuxième enregistrement est bien pris en compte, ce qui fait que le troisième enregistrement remplace une partie du deuxième enregistrement.
Si l'on souhaite que le délimiteur CR soit pris aussi en compte, en plus d'un caractère défini par le programme, on ajoutera la valeur hexadécimale &100, soit 256, à la valeur du code ASCII du délimiteur. Par exemple, pour avoir les délimiteurs | et RC, on indiquera la valeur &17C, soit 380, comme valeur du délimiteur.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0|"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD|"
CLOSE #kfichier&
REM --- Lecture du fichier ---
kfichier& = OPENIN( kfichier$ )
REPEAT
PRINT GET$#kfichier& TO &17C
UNTIL EOF #kfichier&
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL 2.0
Mon BBC BASIC pas a pas
Origine NERD
Enfin, pour que les délimiteurs CR et LF soient pris aussi en compte, en plus d'un caractère défini par le programme, on à joutera la valeur hexadécimale &8000, soit 32768, à la valeur du code ASCII du délimiteur. Par exemple, pour avoir les délimiteurs |, RC et LF, on indiquera la valeur &807C, soit 32892, comme valeur du délimiteur.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0|"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD|"
CLOSE #kfichier&
REM --- Lecture du fichier ---
kfichier& = OPENIN( kfichier$ )
REPEAT
PRINT GET$#kfichier& TO &807C
UNTIL EOF #kfichier&
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SDL 2.0
Mon BBC BASIC pas a pas
Origine NERD
LECTURE DES ENREGISTREMENTS AVEC UNE TAILLE DÉFINIE.
L'instruction GET$# permet de définir la taille des chaines de caractères qui sera retournée, quel que soient le ou les délimiteurs qui ont été utilisés lors des enregistrements des données. Pour définir la taille de la chaine de caractères qui sera retournée, on utilisera la syntaxe GET$#kcanal& BY ktaille% où kcanal& est le numéro du canal associé au fichier et ktaille% un nombre entier indiquant le nombre de caractères qui doivent être lus et être retournés.
REM --- Initialisation ---
kfichier$ = @dir$ + "Tester.txt"
REM --- Création du fichier et enregistrement ---
kfichier& = OPENOUT( kfichier$ )
PRINT #kfichier&, "BBC BASIC SDL 2.0"
PRINT #kfichier&, "Mon BBC BASIC pas a pas"
PRINT #kfichier&, "Origine NERD"
CLOSE #kfichier&
REM --- Lecture du fichier ---
kfichier& = OPENIN( kfichier$ )
REPEAT
kdonnee$ = GET$#kfichier& BY 12
PRINT kdonnee$
UNTIL EOF #kfichier&
CLOSE #kfichier&
REM --- Fin de l'exemple ---
END
retourne :
BBC BASIC SD
Mon BB
C BASIC pas
Origin
e NERD
Notez que les caractères Retour Chariot (CR) sont bien pris en compte, ce qui fait que certaines parties des enregistrements sont remplacées par le début de l'enregistrement suivant.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
Dans la RETROGICIEL vous trouvez des suggestions simples et classiques pour
TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER
avec un exemple de résolution à télécharger pour vous inspirer.