GET

From QB64 Phoenix Edition Wiki
Revision as of 17:42, 23 April 2026 by RhoSigma (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

The GET # statement reads data from a file or port device by bytes or record positions.


Syntax

GET #fileNumber&, [position][, {targetVariable|targetArray()}]


Description

  • fileNumber& is the file or port number used in the OPEN AS BINARY or RANDOM statement.
  • The INTEGER or LONG byte position in a BINARY file or the record position in a RANDOM file must be greater than zero.
  • The position can be omitted if the GET operations are consecutive based on the targetVariable TYPE byte size.
    • GET # can handle fixed size TYPEs only, if a given TYPE contains variable length STRING elements, then you get a syntax error.
  • The targetVariable type or FIELD variable size determines the byte size and the next position in the file.
  • The first byte position in a file is 1.
  • GET does not require a byte or record position or targetVariable (or comma) when using a FIELD statement.
  • QB64 can PUT the entire contents of an array to a file and later GET those contents to a targetArray() (include brackets).
  • GET may ignore the end of a file and return bad data. If the EOF function returns -1 after a GET operation, it indicates that the data has ended.
DO UNTIL EOF(1)
    GET #1, , value%
    IF NOT (EOF(1)) THEN PUT #2, , value%
LOOP


Availability

  • Since arrays in TYPEs were implemented in QB64-PE v4.5.0, this statement was adapted to properly handle it (see Example 3).


Examples

Example 1
Opening a RANDOM file using LEN to calculate and LEN = to designate the file record size.
TYPE variabletype
    x AS INTEGER '     '2 bytes
    y AS STRING * 12 ''12 bytes
    z AS LONG '        '4 bytes
END TYPE '            '18 bytes total
DIM record AS variabletype
DIM newrec AS variabletype

file$ = "testrand.inf" '<<<< filename may overwrite existing file
number% = 1 '<<<<<<<<<< record number to write cannot be zero
RecordLEN% = LEN(record)
PRINT RecordLEN%; "bytes"
record.x = 255
record.y = "Hello world!"
record.z = 65535
PRINT record.x, record.y, record.z

OPEN file$ FOR RANDOM AS #1 LEN = RecordLEN%
PUT #1, number%, record 'change record position number to add records
CLOSE #1

OPEN file$ FOR RANDOM AS #2 LEN = RecordLEN%
NumRecords% = LOF(2) \ RecordLEN%
PRINT NumRecords%; "records"

GET #2, NumRecords%, newrec 'GET last record available
CLOSE #2
PRINT newrec.x, newrec.y, newrec.z

END
 18 bytes
 255        Hello world!       65535
 1 records
 255        Hello world!       65535
Explanation
 The byte size of the record TYPE determines the LOF byte size of the
 file and can determine the number of records. To read the last record
 GET the number of records. To add a new record, use the number of
 records + 1 to PUT new record data.

Example 2
Placing the contents of a numerical array into a BINARY file. You may want to put the array size at the beginning too.
DIM SHARED array(100) AS INTEGER

FOR i = 1 TO 100
    array(i) = i
NEXT
PrintArray 'display array contents

OPEN "BINFILE.BIN" FOR BINARY AS #1

PUT #1, , array()

ERASE array 'clear element values from array and display empty
PrintArray
CLOSE #1

OPEN "BINFILE.BIN" FOR BINARY AS #2
GET #2, , array()
CLOSE #2
PrintArray 'display array after transfer from file

END

SUB PrintArray
    FOR i = 1 TO 100
        PRINT array(i);
    NEXT
    PRINT "done"
    PRINT
END SUB

Example 3
Placing the contents of a nested numerical array into a BINARY file. You may want to put the array size at the beginning too.
TYPE test
    aaa(2) AS DOUBLE
END TYPE

DIM a(1) AS test
PRINT "Generating values..."
FOR y = 0 TO 1
    FOR x = 0 TO 2
        a(y).aaa(x) = (x + 1) * (y + 1)
        PRINT (x + 1) * (y + 1);
NEXT x, y
PRINT
OPEN "s_test.dat" FOR BINARY AS #1
PRINT
PRINT "Saving nested array content to file s_test.dat"
PUT #1, , a()
CLOSE #1

ERASE a 'delete content for a() and all nested arrays in a (see ERASE for more info)

PRINT
PRINT "Reading saved content..."
OPEN "s_test.dat" FOR BINARY AS #1
GET #1, , a()
CLOSE #1

FOR y = 0 TO 1
    FOR x = 0 TO 2
        PRINT a(y).aaa(x);
    NEXT x
NEXT y


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link