PxPLUS en ASCII-tekst bestanden
PxPLUS kan op 9 manieren een bestand vullen.
Er zijn 3 mogelijkheden om een bestand te openen:
- OPEN (1) FILE$
- OPEN (1,ISZ=1) FILE$
- OPEN (1,ISZ=n) FILE$, waar n>1
En je hebt 3 commando's om te schrijven:
- PRINT
- WRITE
- WRITE RECORD
PxPLUS gaat bepaalde separators toevoegen en
dit hangt af van de combinatie die je gebruikt.
|
OPEN (1) |
OPEN (1,ISZ=1) |
OPEN (1,ISZ=n) n>1 |
PRINT |
0D0A |
0D0A |
0D0A000000... |
WRITE |
8A0D0A |
8A |
8A0000000000... |
WRITE RECORD |
0D0A |
Nothing |
000000... till LEN=n |
PxPLUS doet eerst een test op het eerste record
van een 'serial' bestand. Als er een teken gevonden wordt buiten de reeks van
een " " (spatie) en een "~" (tilde), dan beschouwt PxPLUS het bestand als een
binair bestand en de regels van 'OPEN (1,ISZ=1)' zijn van toepassing.
Je moet het bestand LOCKen wil je er iets in
schrijven.
PxPLUS behandelt het bestand op een record georiënteerde manier.
De IND() functie geeft u het huidige record.
PxPLUS voegt altijd $0D0A$ (1) toe
aan het eind van een record.
In geval van een WRITE bevel zal een extra field separator ($8A$) (2)
toegevoegd worden net vóór de record separator ($0D0A$)
Een 'READ RECORD' scant de data in het bestand
naar een $0D0A$ byte combinatie.
Een 'READ' impliceert een 'READ RECORD'. De gegevens van de 'READ RECORD' worden
gebruikt om de variabelen te vullen, waar $8A$ fungeert als field separator.
Een 'READ (1,IND=n)' leest het n+1ste record.
1 record separator
PxPLUS voor Windows, de record separator is $0D0A$
PxPLUS voor UNIX, de record separator is $0A$
In mijn voorbeelden heb ik steeds $0D0A$ gebruikt.
2 field separator
De standaard field separator is $8A$, maar kan gewijzigd worden met de 'FS'
parameter.
Als je een bestand opent met ',ISZ=1', dan open
je het bestand in BINAIRE mode. Zelfs als het een KEYED bestand is.
Om compatibel te zijn met andere Business Basics, is 'ISZ=-1' toegestaan.
Deze manier van OPEN, impliceert een LOCK op het bestand.
PxPLUS behandelt het bestand op een byte georiënteerde manier.
De IND() functie geeft u de byte pointer of m.a.w. het aantal bytes dat u
gelezen heeft.
PRINT X$ schrijft X$+$0D0A$
WRITE X$ schrijft X$+$8A$
WRITE RECORD X$ schrijft X$ en voegt niets toe aan de variabele, maar als de
variabele leeg is wordt er een $00$ byte toegevoegd.
Normaal lees je het bestand met READ
RECORD(1,SIZ=nnn)X$
Anders wordt , 'SIZ=1' genomen.
'READ(1,IND=n)' leest de n+1ste byte.
Opgepast met deze manier van lezen en schrijven.
Test altijd of het resultaat klopt met wat u wenste.
'PRINT' schrijft de variabele(n) in het bestand.
Elke PRINT wordt beëindigd met $0D0A$.
Achtereenvolgende PRINTs kunnen uitgevoerd worden. Geen field separator tussen
twee velden.
Wanneer het n aantal bytes bereikt is wordt er een ERROR #1 gegenereerd.
Wanneer het n aantal bytes niet bereikt wordt, dan wordt the rest van n bytes
gevuld met $00$
'WRITE' schrijft de variabele(n) in het bestand. Een field separator ($8A$)
wordt toegevoegd achter elk veld. De resterende n bytes worden gevuld met $00$.
'WRITE RECORD' schrijft de gegevens in het bestand zonder separator. De
resterende n bytes worden telkens gevuld met $00$.
Een 'READ' impliceert een READ RECORD met n
aantal bytes. De variabelen worden gevuld aan de hand van het gelezen record.
Een 'READ RECORD' leest n aantal bytes (n = gespecificeerd bij de OPEN)
Een 'READ RECORD (1,SIZ=x) leest x bytes.
- Tip: Gebruik PRINT, WRITE, and WRITE RECORD niet door elkaar om een
bestand te vullen, tenzij u weet wat u doet.
Samenvatting
- Als je een 'serial' bestand wil vullen, met de bedoeling het te
gebruiken om iets terug te 'MERGE'n:
WRITE PROCEDURE |
READ PROCEDURE |
SERIAL F$
OPEN LOCK (1) F$
PRINT (1)"10 REM"
PRINT (1)"20 BEGIN"
PRINT (1)"30 FOR I=1 to 10"
PRINT ...
PRINT (1)"9999 END
|
CLOSE (1)
OPEN (1)F$
MERGE (1)
|
- Als je volledige controle wil hebben over wat je schrijft:
Bv. : U moet een bestand maken opdat iemand
anders het kan inlezen.
Ze leggen u enkele regels op: het record moet 128 bytes lang zijn en
gescheiden door een 'TAB' character ($09$).
WRITE PROCEDURE |
READ PROCEDURE |
SERIAL F$
OPEN (1,isz=1) F$
DIM X$(128)
X$(1)=SOME_CODE$
X$(25)=OTHER_STUFF$
...
X$=X$+$09$
WRITE RECORD (1)X$
...
|
OPEN(1,isz=1)F$
GET:
READ(1,siz=129,end=DONE)X$
GOTO GET
DONE:
|
- Als u records met variabelen in een 'serial' bestand wil schrijven met
de bedoeling ze achteraf terug in te lezen:
WRITE PROCEDURE |
READ PROCEDURE |
SERIAL F$
OPEN LOCK (1) F$
PUT:
A$= ... , B$= ... , C$= ...
WRITE (1)A$,B$,C$
GOTO PUT
|
OPEN (1) F$
GET:
READ(1,end=DONE)X$,Y$,Z$
GOTO GET
DONE:
|
Voorbeeld programma
0010 BEGIN ; PRINT 'CS','SB'
0020 FOR I=1 TO 2
0030 LET F$="c:\tmp\erase.me"; ERASE F$,ERR=*PROCEED; SERIAL F$
0050 !
0060 IF I=1 THEN OPEN LOCK (1)F$; PRINT "OPEN (1) "
0070 IF I=2 THEN OPEN LOCK (1,ISZ=1)F$; PRINT "OPEN(1,ISZ=1)"
0080 !
0090 PRINT (1)"111"
0100 WRITE (1)"222"
0110 WRITE RECORD (1)"333"
0130 PRINT (1)"444"
0140 WRITE (1)"555"
0150 WRITE RECORD (1)"666"
0160 !
0170 CLOSE (1); OPEN (1,ISZ=1) F$
0180 READ RECORD (1,SIZ=-1000) X$
0190 PRINT 'LF',"Binary file contents: ",'LF','LF','SF',HTA(X$),
0200 !
0330 CLOSE (1)
0331 PRINT 'SB','LF'
0340 NEXT I
|