forked from Galleondragon/qb64
-
Notifications
You must be signed in to change notification settings - Fork 23
FIELD
Cory Smith edited this page Sep 1, 2022
·
5 revisions
The FIELD statement creates a STRING type definition for a RANDOM-access file buffer.
FIELD [#]fileNumber&, fieldWidth1% AS variable1$[, fieldWidthN% AS variableN$]
- fileNumber% is a file number used in the OPEN statement or a value from the FREEFILE function.
- Combined size of the fieldWidth% parameters must not exceed the LEN = recordsize in the RANDOM OPEN statement or a ERROR Codes will occur.
- Variables are limited to STRING types. Use TYPE instead of FIELD if you want to use numerical values.
- Once a FIELD is defined in a statement, GET can read and PUT can write data without placeholders or variables.
- LSET, RSET, PRINT (file statement), PRINT USING (file statement), and WRITE (file statement) can be used to place characters in the file buffer before a PUT.
- All field definitions for a file are removed when the file is CLOSE or RESET and all strings are set to null ("").
- Do not re-assign a field defined variable value or use it in an INPUT statement if you want the variable to remain a field.
Comparing a TYPE definition with a FIELD STRING definition. Demo using a TYPE definition to create a file:
TYPE ClientType
CName AS STRING * 30 '30 bytes
Address AS STRING * 30 '30 bytes
City AS STRING * 15 '15 bytes
State AS STRING * 2 ' 2 bytes
Zip AS STRING * 5 ' 5 bytes
END TYPE ' total size = 82 bytes
DIM Client AS ClientType
RecordLEN = LEN(Client) 'find the size of each TYPE record
OPEN "ADDRESS.DAT" FOR RANDOM AS #1 LEN = RecordLEN
RESTORE ClientData 'restore to start of DATA
record = 0
DO
READ CName$, Address$, City$, State$, Zip$ 'read DATA
IF CName$ = "END" THEN EXIT DO
record = record + 1 'increment record number
Client.CName = CName$
Client.Address = Address$
Client.City = City$
Client.State = State$
Client.Zip = Zip$
PUT #1, record, Client 'PUT by record number
LOOP
CLOSE #1
END
ClientData:
DATA "Bob White","104 Birdland Rd.","Bellview","PA","15236"
DATA "Ward Cleaver","123 W. Beaver St.","Beaver","PA","15255"
DATA "Elmer Fudd","45 Wabbit St.","Bethel Park","PA","15022"
DATA "Wyley Coyote","33 Roadrunner Ave.","Clairton","PA","15122"
DATA "Jim Morrison","19 Doorway Dr.","Belleview","PA","15236"
DATA "END",0,0,0,0
Demo using the FIELD statement to read the file:
CONST NM = 30, AD = 30, CT = 15, ST = 2, ZC = 5 ' Define field and record lengths with constants.
CONST RLEN = NM + AD + CY + ST + ZC
'
OPEN "ADDRESS.DAT" FOR RANDOM AS #1 LEN = RLEN
FIELD #1, NM AS CName$, AD AS Address$, CY AS City$, ST AS State$, ZC AS Zip$
FIELD #1, RLEN AS Clist$ 'define entire record
GET #1, 1 'GET does not need a variable to read FIELD records!
'Read file for zip codes from 15230 to 15239 .
DO WHILE NOT EOF(1)
ZipCheck$ = Zip$ 'read zip codes
IF (ZipCheck$ >= "15230" AND ZipCheck$ <= "15239") THEN
Info$ = Clist$
PRINT LEFT$(Info$, 30) 'read name string
PRINT MID$(Info$, 31, 30) 'read address string
PRINT RIGHT$(Info$, 17) 'read city, state and zip code
PRINT
END IF
GET #1 'simply GET reads each FIELD record after first
LOOP
CLOSE #1
END