Enregistrement
GW-BASIC (PC-BASIC)
Accéder à un fichier séquentiel
Votre première et principale tâche est de stocker vos informations en permanence sur le disque.
Prêt à s'organiser? Nous continuerons avec votre collection de livres. Voici une petite liste de livres :
1. TRAVAIL
2. LE BERCEAU DU
CHAT
3. PETIT C'EST BEAU
4. INTRODUCTION A GW-BASIC
Si vous avez lu votre introduction, vous savez comment sauvegarder des programmes de base sur le disque. Pour enregistrer des informations, vous avez besoin d'un programme qui suit ces étapes :
ÉTAPES POUR ENREGISTRER DES INFORMATIONS SUR LE DISQUE
1. Ouvrez la communication sur
le disque afin que vous puissiez envoyer l'information vers un fichier
2.
Enregistrer toutes les informations dans le fichier.
3. Fermez la
communication avec le fichier sur le disque.
Lancez le programme avec
cette ligne :
10 OPEN "O",1,"Livres.txt"
Cela ouvre le fichier 1 "Livres" pour que vous puissiez "sortir" ("O") les informations en mode de sortie séquentiel.
Quelles que soient les informations que vous produisez, l'ordinateur les stocke sur le disque dans un "fichier" nommé LIVRES. Sortez maintenant les informations.
Taper:
15 CLS: PRINT "ENTREZ VOS
LIVRES - TAPEZ <XX> UNE FOIS TERMINÉ"
10 OPEN "O",1,"Livres.txt"
20 INPUT
"TITRE"; T$
30 PRINT #1, T$
40 GOTO 15
La ligne 30 "enregistre" (sort) vos titres de livres --- pas sur l'écran, mais sur le disque.
Fermez ensuite les communications. Taper:
25 IF T$ = "XX" OR T$ = "xx"
THEN 50
50 CLOSE #1
L'ordinateur ferme alors la communication avec le fichier.
Ajoutez trois lignes supplémentaires au programme :
Exécutez ensuite le programme.
L'ordinateur ouvre un "fichier" sur le disque et le nomme LIVRES.
Le
programme demande alors des titres. Taper:
TITRE? TRAVAIL
TITRE? LE BERCEAU DU CHAT
TITRE? PETIT C'EST BEAU
TITRE? INTRODUCTION A GW-BASIC
Chaque fois que vous saisissez
un titre, l'ordinateur l'imprime dans un emplacement spécial de la mémoire
réservé au disque. Lorsque vous avez terminé, l'ordinateur imprime tous les
titres dans le fichiers (Ligne 30) puis ferme la communication avec le fichier
(Ligne 50).
Vos titres de livres sont maintenant tous enregistrés sur
disque dans un fichier nommé Livres.txt. Pour les relire en mémoire, suivez à
peu près les mêmes étapes.
ÉTAPES POUR LA SAISIE D'INFORMATIONS À PARTIR DU FICHIER
1. Ouvrez un fichier afin de
pouvoir saisir des informations à partir d'un fichier.
2. Vérifiez si vous
êtes à la fin du fichier.
3. Entrez les informations du fichier du disque.
4. Répétez les étapes 2 et 3 jusqu'à ce que vous atteignez la fin du fichier.
Tapez:
80 OPEN "I", #1, "Livres.txt"
90 INPUT #1,B$
100 PRINT B$
La ligne 90 entre le premier
titre de livre (B$ du fichier Livres stocké sur bande.
(Le nom de la variable
que vous choisissez ne fait aucune différence.) La ligne 100 affiche ce titre
sur votre écran.
Pour vérifier la fin du fichier et fermer le fichier, ajoutez ces lignes :
85 IF EOF(1) THEN 120
110
GOTO 85
120 CLOSE #1
La ligne 85 indique si vous êtes à la fin de ce fichier (dans ce CAS, le fichier Livres). aller à 120 et fermer le fichier.
Notez que EOF(1) vient avant la ligne INPUT #1. Si c'est après INPUT #1, vous obtiendrez une erreur IE error après la fin du fichier.
Listez cette dernière partie du
programme en tapant list. Ça devrait ressembler à ça:
80 OPEN "I", #1, "Livres.txt"
85 IF EOF(1) THEN 120
90 INPUT #1,B$
100 PRINT B$
110 GOTO 85
120
CLOSE #1
Exécutez maintenant cette partie du programme.
L'ordinateur entre les éléments du disque. Une fois terminé, il affiche les quatre éléments sur votre écran.
Un catalogue électronique de cartes
Supposons que vous deviez modifier le programme afin qu'il puisse également stocker les auteurs et les sujets des livres :
Titre TRAVAIL LE BERCEAU DU CHAT PETIT C'EST BEAU INTRODUCTION A GW-BASIC |
Auteur Studs Terkel Kurt Vonnegut E. F. Shumacher Michel Gaudet |
Sujet Sociologie Fiction Économie Informatique |
Commencez par changer la partie "sortie" du programme (la première moitié). Tapez ces lignes :
15 CLS: PRINT "ENTREZ VOS
LIVRES - TAPEZ <XX> UNE FOIS TERMINÉ"
10 OPEN "O",1,"Livres2.txt"
20 INPUT
"TITRE"; T$
25 IF T$ = "XX" OR T$ = "xx" THEN 50
26 INPUT "AUTEUR"; A$
27 INPUT "SUJET"; S$
30 PRINT #1, T$; "," A$ "," ; S$ 'Les variables dans le
fichier doivent être séparées par des virgules
40 GOTO 15
50 CLOSE #1
Modifiez ensuite la partie "INPUT" du programme. Tapez ces lignes :
80 OPEN "I", #1, "Livres2.txt"
85 IF EOF(1) THEN 120
90 INPUT #1,T$,A$,S$
100 PRINT T$,A$,S$
110 GOTO
85
120 CLOSE #1
Profitez maintenant de cette organisation.
Par exemple, demandez au programme d'afficher une liste de livres sur un sujet donné. Ajoutez ces lignes :
130 CLS
140 INPUT "QUEL
SUJET"; C$
150 CLS: PRINT C$, "Livres" : PRINT
160 OPEN "I", #1,
"Livres2.txt"
170 IF EOF(1) THEN 210
180 INPUT #1,T$,A$,S$
190 IF S$ =
C$ THEN PRINT "Titre",T$,"Auteur", A$
200 GOTO 170
210 CLOSE #1
Programme faites-le vous même
Supposons que vous ayez ces informations:
No. 101 102 103 104 105 |
Date 5-13 5-13 5-14 5-17 5-19 |
Payable à Safeway Amoco Joe's Cafe American Airline Holiday Inn |
Compte Nourriture Voiture Nourriture Vacances Vacances |
Montant $ 52.60 32.70 10.32 97.50 72.30 |
Fichiers à accès aléatoire
Les informations contenues dans les fichiers à accès aléatoire sont stockées et accessibles dans des unités numérotées distinctes appelées enregistrements. Étant donné que les informations sont appelées par numéro, les données peuvent être appelées à partir de n'importe quel emplacement du disque ; le programme n'a pas besoin de lire l'intégralité du disque, comme lors de la recherche de fichiers séquentiels, pour localiser les données.
GW-BASIC prend en charge les
gros fichiers aléatoires. Le nombre maximal d'enregistrements logiques est 232
-1.
Les instructions et fonctions suivantes sont utilisées avec des
fichiers aléatoires :
CLOSE | FIELD | MKI$ |
CVD | LOC | MKS$ |
CVI | LOCK | OPEN |
CVS | LOF | PUT |
EOF | LSET/RSET | UNLOCK |
ET | MKD$ |
Création d'un fichier à accès aléatoire
Les étapes de programme
suivantes sont nécessaires pour créer un fichier de données aléatoires :
1. Ouvrez le fichier pour le mode d'accès aléatoire (R). L'exemple suivant
spécifie une longueur d'enregistrement de 32 octets. Si la longueur
d'enregistrement est omise, la valeur par défaut est de 128 octets.
OPEN "R", #1, "filename", 32
2. Utilisez l'instruction FIELD pour allouer de l'espace dans le tampon aléatoire aux variables qui seront écrites dans le fichier aléatoire :
FIELD#1, 20 AS N$, 4 AS A$, 8 AS P$
Dans cet exemple, les 20
premières positions (octets) dans le tampon de fichier aléatoire sont allouées à
la variable de chaîne N$. Les 4 positions suivantes sont attribuées à A$ ; les 8
suivants à P$.
3. Utilisez LSET ou RSET pour déplacer les données dans
les champs aléatoires du tampon dans un format justifié à gauche ou à droite (L=left
SET;R=right SET).
Les valeurs numériques doivent être transformées en chaînes lorsqu'elles sont placées dans le tampon. MKI$ convertit une valeur entière en une chaîne ; MKS$ convertit une valeur simple précision et MKD$ convertit une valeur double précision.
LSET N$=X$
LSET A$=MKS$(AMT)
LSET P$=TEL$
4. Écrivez les données du tampon sur le disque à l'aide de l'instruction PUT :
PUT #1, CODE%
Le programme de l'exemple 1
prend les informations saisies en entrée au niveau du terminal et les écrit dans
un fichier de données à accès aléatoire. Chaque fois que l'instruction PUT est
exécutée, un enregistrement est écrit dans le fichier. Dans l'exemple, l'entrée
CODE% à 2 chiffres à la ligne 30 devient le numéro d'enregistrement.
Noter
N'utilisez pas de variable de chaîne avec champ dans une
instruction INPUT ou LET. Ainsi, le pointeur de cette variable pointe dans
l'espace chaîne au lieu du tampon de fichier aléatoire.
Exemple 1
10 OPEN "R", #1, "INFOFILE", 32 20 FIELD#1, 20 AS N$, 4 AS A$, 8 AS P$ 30 INPUT "2-DIGIT CODE"; CODE% 40 INPUT "NAME"; X$ 50 INPUT "AMOUNT"; AMT 60 INPUT "PHONE"; TEL$: PRINT 70 LSET N$=X$ 80 LSET A$=MKS$(AMT) 90 LSET P$=TEL$ 100 PUT #1, CODE% 110 GOTO 30
Accéder à un fichier à accès aléatoire
Les étapes de programme
suivantes sont nécessaires pour accéder à un fichier aléatoire :
1.
Ouvrez le fichier en mode R :
OPEN "R", #1, "filename", 32
2. Utilisez l'instruction FIELD pour allouer de l'espace dans le tampon aléatoire aux variables qui seront lues à partir du fichier :
FIELD, #1, 20 AS N$, 4 AS A$, 8 AS P$
Dans cet exemple, les 20
premières positions (octets) dans le tampon de fichier aléatoire sont allouées à
la variable de chaîne N$. Les 4 positions suivantes sont attribuées à A$ ; les 8
suivants à P$.
Noter
Dans un programme qui exécute à la fois INPUT
et OUTPUT sur le même fichier aléatoire, vous pouvez souvent utiliser une seule
instruction OPEN et une seule instruction FIELD.
3. Utilisez
l'instruction GET pour déplacer l'enregistrement souhaité dans la mémoire tampon
aléatoire.
GET #1, CODE%
Les données dans la mémoire
tampon sont maintenant accessibles par le programme.
4. Reconvertissez
les valeurs numériques en nombres à l'aide des fonctions de conversion : CVI
pour les nombres entiers, CVS pour les valeurs à simple précision et CVD pour
les valeurs à double précision.
PRINT N$
PRINT CVS(A$)
. . .
Le programme de l'exemple 2
accède au fichier aléatoire, INFOFILE, qui a été créé dans l'exemple 1. En
entrant le code à 3 chiffres, les informations associées à ce code sont lues à
partir du fichier et affichées.
Exemple 2
10 OPEN "R",#1,"INFOFILE",32 20 FIELD #1, 20 AS N$, 4 AS A$, 8 AS P$ 30 INPUT "2-DIGIT CODE";CODE% 40 GET #1, CODE% 50 PRINT N$ 60 PRINT USING "$$###.##";CVS(A$) 70 PRINT P$:PRINT 80 GOTO 30
Avec des fichiers aléatoires, la fonction LOC renvoie le numéro d'enregistrement actuel. Le numéro d'enregistrement en cours est le dernier numéro d'enregistrement utilisé dans une instruction GET ou PUT.
Par exemple, la ligne suivante termine l'exécution du programme si le numéro d'enregistrement courant dans le fichier n°1 est supérieur à 99 :
IF LOC(1)>99 THEN END
L'exemple 3 est un programme
d'inventaire qui illustre l'accès aléatoire aux fichiers. Dans ce programme, le
numéro d'enregistrement est utilisé comme numéro de pièce et il est supposé que
l'inventaire ne contiendra pas plus de 100 numéros de pièce différents.
Les lignes 900-960 initialisent le fichier de données en écrivant CHR$(255)
comme premier caractère de chaque enregistrement. Ceci est utilisé plus tard
(ligne 270 et ligne 500) pour déterminer si une entrée existe déjà pour ce
numéro de pièce.
Les lignes 130 à 220 affichent les différentes fonctions
d'inventaire exécutées par le programme. Lorsque vous tapez le numéro de
fonction souhaité, la ligne 230 se branche sur le sous-programme approprié.
Exemple 3
120 OPEN"R",#1,"INVEN.DAT",39 125 FIELD#1,1 AS F$,30 AS D$, 2 AS Q$,2 AS R$,4 AS P$ 130 PRINT:PRINT "FUNCTIONS:":PRINT 135 PRINT 1,"INITIALIZE FILE" 140 PRINT 2,"CREATE A NEW ENTRY" 150 PRINT 3,"DISPLAY INVENTORY FOR ONE PART" 160 PRINT 4,"ADD TO STOCK" 170 PRINT 5,"SUBTRACT FROM STOCK" 180 PRINT 6,"DISPLAY ALL ITEMS BELOW REORDER LEVEL" 220 PRINT:PRINT:INPUT"FUNCTION";FUNCTION 225 IF (FUNCTION<1)OR(FUNCTION>6) THEN PRINT "BAD FUNCTION NUMBER":GOTO 130 230 ON FUNCTION GOSUB 900,250,390,480,560,680 240 GOTO 220 250 REM BUILD NEW ENTRY 260 GOSUB 840 270 IF ASC(F$) < > 255 THEN INPUT"OVERWRITE";A$: IF A$ < > "Y" THEN RETURN 280 LSET F$=CHR$(0) 290 INPUT "DESCRIPTION";DESC$ 300 LSET D$=DESC$ 310 INPUT "QUANTITY IN STOCK";Q% 320 LSET Q$=MKI$(Q%) 330 INPUT "REORDER LEVEL";R% 340 LSET R$=MKI$(R%) 350 INPUT "UNIT PRICE";P 360 LSET P$=MKS$(P) 370 PUT#1,PART% 380 RETURN 390 REM DISPLAY ENTRY 400 GOSUB 840 410 IF ASC(F$)=255 THEN PRINT "NULL ENTRY":RETURN 420 PRINT USING "PART NUMBER ###";PART% 430 PRINT D$ 440 PRINT USING "QUANTITY ON HAND #####";CVI(Q$) 450 PRINT USING "REORDER LEVEL #####";CVI(R$) 460 PRINT USING "UNIT PRICE $$##.##";CVS(P$) 470 RETURN 480 REM ADD TO STOCK 490 GOSUB 840 500 IF ASC(F$)=255 THEN PRINT "NULL ENTRY":RETURN 510 PRINT D$:INPUT "QUANTITY TO ADD";A% 520 Q%=CVI(Q$)+A% 530 LSET Q$=MKI$(Q%) 540 PUT#1,PART% 550 RETURN 560 REM REMOVE FROM STOCK 570 GOSUB 840 580 IF ASC(F$)=255 THEN PRINT "NULL ENTRY":RETURN 590 PRINT D$ 600 INPUT "QUANTITY TO SUBTRACT";S% 610 Q%=CVI(Q$) 620 IF (Q%-S%)<0 THEN PRINT "ONLY";Q%;"IN STOCK" :GOTO 600 630 Q%=Q%-S% 640 IF Q%= < CVI(R$) THEN PRINT "QUANTITY NOW";Q%;"REORDER LEVEL";CVI(R$) 650 LSET Q$=MKI$(Q%) 660 PUT#1,PART% 670 RETURN 680 REM DISPLAY ITEMS BELOW REORDER LEVEL4 690 FOR I=1 TO 100 710 GET#1,I 720 IF CVI(Q$)<CVI(R$) THEN PRINT D$;"QUANTITY";CVI(Q$) TAB(50) "REORDER LEVEL";CVI(R$) 730 NEXT I 740 RETURN 840 INPUT "PART NUMBER";PART% 850 IF(PART% < 1)OR(PART% > 100) THEN PRINT "BAD PART NUMBER":GOTO 840 ELSE GET#1,PART%:RETURN 890 END 900 REM INITIALIZE FILE 910 INPUT "ARE YOU SURE";B$:IF B$ < > "Y" THEN RETURN 920 LSET F$=CHR$(255) 930 FOR I=1 TO 100 940 PUT#1,I 950 NEXT I 960 RETURN