GET Statement

Syntax

Syntax: GET #n, [position,] variable
Source: pb_cg_emit_get (pb_codegen.c:780)

Description

Reads binary data from the file associated with file number #n into a variable. The file must be opened for BINARY or RANDOM access. If the optional position is specified, the file pointer is first set to that position before reading. In RANDOM mode, the position represents a 1-based record number (byte offset = (position - 1) * LEN). In BINARY mode, the position represents a 1-based byte position.

The number of bytes read is determined by the data type of the target variable: 1 byte for BYTE, 2 bytes for WORD/INTEGER, 4 bytes for LONG, 8 bytes for QUAD/DOUBLE, and the record length for UDTs. V19 uses the packed scalar byte size instead of a fixed 8-byte default.

Parameters

ParameterDescription
nThe integer file number. Must be opened for BINARY or RANDOM access.
position(Optional) 1-based record position in RANDOM mode, or 1-based byte position in BINARY mode. If omitted, the current file pointer is used.
variableThe variable to read data into. Can be any numeric type (BYTE, WORD, LONG, QUAD, SINGLE, DOUBLE), a fixed-length STRING, or a UDT with only fixed-size fields.

Example

TYPE Employee
    id AS LONG
    nam AS STRING * 32
    salary AS SINGLE
END TYPE

FUNCTION PBMAIN() AS LONG
    LOCAL emp AS Employee
    LOCAL val AS LONG

    ' Binary mode: read LONG at byte position 100
    OPEN "data.bin" FOR BINARY AS #1
    GET #1, 100, val          ' read 4 bytes at offset 99 (0-based)
    CLOSE #1

    ' Random mode: read record 5 (each 40 bytes)
    OPEN "employees.dat" FOR RANDOM AS #2 LEN = 40
    GET #2, 5, emp            ' read record 5 (offset 4 * 40 = 160)
    PRINT emp.nam
    CLOSE #2

    FUNCTION = 0
END FUNCTION

Generated Assembly

GET with Position (Seek + Read)

; Step 1: If position specified, seek to correct offset
; RANDOM mode: offset = (position - 1) * record_length
; BINARY mode: offset = (position - 1) * sizeof(variable)
cmp    rax, 1                           ; check position >= 1
jge    __pb_get_compute_offset
xor    rax, rax                         ; clamp to 0 if < 1
jmp    __pb_get_seek
__pb_get_compute_offset:
sub    rax, 1                           ; 1-based -> 0-based
imul   rax, <record_length_or_size>     ; multiply by record/element size
__pb_get_seek:
mov    rcx, [rbp - handle_offset]
mov    rdx, rax                         ; distance to move
xor    r8, r8                           ; 0 for low DWORD
mov    r9, 0                            ; FILE_BEGIN
call   [__imp_SetFilePointer]

; Step 2: Read data into target variable
mov    rcx, [rbp - handle_offset]       ; file handle
mov    rdx, target_ptr                  ; address of target variable
mov    r8, <element_size>              ; bytes to read (depends on type)
lea    r9, [rbp - file_read_count]      ; &bytesRead
mov    [rsp + 32], 0                    ; lpOverlapped = NULL
call   [__imp_ReadFile]

GET without Position (Sequential Read)

; No seek: read from current file pointer
mov    rcx, [rbp - handle_offset]       ; file handle
mov    rdx, target_ptr                  ; address of target variable
mov    r8, <element_size>              ; bytes to read
lea    r9, [rbp - file_read_count]      ; &bytesRead
mov    [rsp + 32], 0                    ; lpOverlapped = NULL
call   [__imp_ReadFile]

Scalar Size Reference V19

Data TypeBytes ReadExample
BYTE1GET #1, , b
INTEGER / WORD2GET #1, , w
LONG / SINGLE4GET #1, , l
QUAD / DOUBLE8GET #1, , q
STRING * nnGET #1, , s
UDTLEN(udt)GET #1, , rec

Imported WinAPI Functions

FunctionDLLPurpose
SetFilePointerkernel32.dllSet file pointer before reading (when position is specified)
ReadFilekernel32.dllRead binary data from file into target variable

Notes