Reads a selected record from a file into memory.
Call with:
AH = 21H
DS:DX = segment:offset of previously opened file control block
Returns:
AL = 00H if read successful
01H if end of file
02H if segment wrap, read canceled
03H if partial record read at end of file
Notes:
The record is read into memory at the current disk transfer area address, specified by the most recent call to Int 21H Function 1AH. It is the programmer's responsibility to ensure that this area is large enough for any record that will be transferred. If the size and location of the buffer are such that a segment overflow or wraparound would occur, the function fails with a return code of 02H.
The file location of the data to be read is determined by the combination of the relative-record field (offset 21H) and the record-size field (offset 0EH) of the FCB. The default record size is 128 bytes.
The current block field (offset 0CH) and current record field (offset 20H) are updated to agree with the relative-record field as a side effect of the function.
The relative-record field of the FCB is not incremented by this function; it is the responsibility of the application to update the FCB appropriately if it wishes to read successive records. Compare with Int 21H Function 27H, which can read multiple records with one function call and automatically increments the relative-record field.
If a partial record is read at end of file, it is padded to the requested record length with zeros.
[3.0+] If the program is running on a network, the user must have Read access rights to the directory containing the file to be read.
Example:
Open the file MYFILE.DAT, set the record length to 1024 bytes, then read record number 4 from the file into the buffer named buff.
myfcb db 0 ; drive = default
db 'MYFILE ' ; filename, 8 chars
db 'DAT' ; extension, 3 chars
db 25 dup (0) ; remainder of FCB
buff db 1024 dup (?) ; receives read data
.
.
.
; open the file
mov ah,0fh ; function number
mov dx,seg myfcb ; address of FCB
mov ds,dx
mov dx,offset myfcb
int 21h ; transfer to MS-DOS
or al,al ; check open status
jnz error ; jump if no file
; set DTA address
mov ah,1ah ; function number
mov dx,offset buff ; read buffer address
int 21h ; transfer to MS-DOS
; set record size
mov word ptr myfcb+0eh,1024
; set record number
mov word ptr myfcb+21h,4
mov word ptr myfcb+23h,0
; read the record
mov ah,21h ; function number
mov dx,offset myfcb ; address of FCB
int 21h ; transfer to MS-DOS
or al,al ; check status
jnz error ; jump if read failed
.
.
.