LINE INPUT #n Statement
Syntax
Syntax: LINE INPUT #n, stringvar$
Source: pb_cg_emit_read_file_line (pb_codegen.c:5291), reworked in V13
Description
Reads an entire line of text from the file associated with file number #n into a STRING variable, discarding the trailing line-ending characters (CR, LF, or CRLF). Unlike INPUT #n, LINE INPUT does not interpret commas or quotes as delimiters—the entire line is read verbatim.
The V13 implementation uses a character-by-character read loop that correctly handles all common line-ending conventions: CR+LF (Windows), LF-only (Unix), and CR-only (classic Mac). V19 adds encoding-aware reading: when the file is opened with ENCODING UTF16LE or ENCODING UTF16LE_BOM, LINE INPUT reads UTF-16 code units and converts them to UTF-8-compatible ANSI for STRING targets.
Parameters
| Parameter | Description |
n | The integer file number to read from. The file must be opened for INPUT, BINARY, or RANDOM access. |
stringvar$ | A STRING variable to receive the line text. The trailing line-ending characters are stripped. |
Example
FUNCTION PBMAIN() AS LONG
LOCAL ln AS STRING
LOCAL lineNum AS LONG
lineNum = 0
OPEN "data.txt" FOR INPUT AS #1
WHILE NOT EOF(1)
INCR lineNum
LINE INPUT #1, ln
PRINT "Line "; lineNum; ": "; ln
WEND
CLOSE #1
FUNCTION = 0
END FUNCTION
Encoding-Aware Example V19
' Read a UTF-16LE encoded file with BOM
OPEN "unicode.txt" FOR INPUT ENCODING UTF16LE_BOM AS #1
LINE INPUT #1, s$ ' reads UTF-16LE, converts to ANSI/UTF-8 STRING
PRINT s$
CLOSE #1
Line Ending Behavior
| Bytes in File | Result in var$ | Origin |
Hello\r\n (0D 0A) | "Hello" | Windows / DOS |
World\n (0A) | "World" | Unix / Linux |
Line\r (0D) | "Line" | Classic Mac OS |
NoNewline (no terminator) | "NoNewline" | Final line before EOF |
\r\n\r\n (blank line) | "" (empty string) | Blank line in text file |
Generated Assembly
Character-by-Character Read Loop (V13)
; Read one byte at a time until CR, LF, or EOF
__pb_liread_loop:
mov rcx, [rbp - handle_offset] ; file handle
lea rdx, [rbp - one_byte_temp] ; single-byte buffer
mov r8, 1 ; read exactly 1 byte
lea r9, [rbp - bytes_read] ; &bytesRead
mov [rsp + 32], 0 ; lpOverlapped = NULL
call [__imp_ReadFile]
cmp rax, 0 ; ReadFile returns 0 on failure
je __pb_liread_eof ; treat as EOF
mov al, byte [rbp - one_byte_temp] ; load the byte
cmp al, 13 ; is it CR?
je __pb_liread_check_lf ; maybe CRLF ahead
cmp al, 10 ; is it LF?
je __pb_liread_done ; line complete (LF-only)
; Not a line ending: store the byte
lea rdi, [rbp - linebuf_offset] ; output buffer
add rdi, [rbp - linebuf_pos] ; current write position
mov [rdi], al ; store byte
inc qword [rbp - linebuf_pos] ; advance position
jmp __pb_liread_loop ; read next byte
__pb_liread_check_lf:
; CR found. Peek ahead for LF (CRLF handling).
mov rcx, [rbp - handle_offset]
lea rdx, [rbp - one_byte_temp]
mov r8, 1
lea r9, [rbp - bytes_read]
mov [rsp + 32], 0
call [__imp_ReadFile]
cmp rax, 0
je __pb_liread_done ; CR at EOF
mov al, byte [rbp - one_byte_temp]
cmp al, 10 ; LF follows CR?
je __pb_liread_done ; consume the LF
; Not LF: push it back conceptually (simple approach: ignore)
__pb_liread_done:
; NUL-terminate the line buffer
mov r10, [rbp - linebuf_pos]
lea r11, [rbp - linebuf_offset]
add r11, r10
mov byte [r11], 0 ; buffer[pos] = 0
; Assign the NUL-terminated buffer to target STRING variable
__pb_liread_eof:
; EOF reached before any line ending
; Just NUL-terminate whatever was accumulated and return
UTF-16LE Encoding-Aware Read V19
; When ENCODING UTF16LE or UTF16LE_BOM is set:
; 1. Read 2 bytes at a time (one UTF-16 code unit)
; 2. Convert UTF-16LE code unit to multi-byte UTF-8 sequence
; 3. Check for CR (0x000D) and LF (0x000A) as 16-bit values
; 4. When line ending found, convert accumulated UTF-16LE to ANSI STRING
; using WideCharToMultiByte(CP_ACP, 0, wbuf, wlen, buf, buflen, 0, 0)
Comparison: INPUT# vs LINE INPUT#
| Aspect | INPUT #n | LINE INPUT #n |
| Target variable | STRING or numeric | STRING only |
| Comma handling | Field separator | Literal character |
| Quote handling | String delimiter | Literal character |
| Line endings | Any whitespace | CR / LF / CRLF |
| Encoding-aware | No | V19 Yes |
Imported WinAPI Functions
| Function | DLL | Purpose |
ReadFile | kernel32.dll | Read single bytes in loop for line detection |
WideCharToMultiByte | kernel32.dll | V19 Convert UTF-16LE to ANSI for encoding-aware reads |