4.8.2. Чтение и запись в файл

Функция DOS3Fh: Чтение из файла или устройства Вход:    АН = 3Fh

ВХ - идентификатор

СХ = число байтов

DS:DX = адрес буфера для приема данных Выход: CF = 0 и АХ = число считанных байтов, если не было ошибки

CF = 1 и АХ = 05h, если доступ запрещен, 06h, если неправильный иден­тификатор

Если при чтении из файла число фактически считанных байтов в АХ меньше,

чем заказанное число в СХ, то был достигнут конец файла. Каждая следующая операция чтения, так же как и записи, начинается не с начала файла, а с того бай­та, на котором остановилась предыдущая операция чтения/записи. Если требует­ся считать (или записать) произвольный участок файла, используют функцию 42h (функция lseek в С).

Функция DOS    Переместить указатель чтения/записи

Вход:   АН - 42h

ВХ = идентификатор

CX:DX = расстояние, на которое надо переместить указатель (со знаком) AL = перемещение:

0 — от начала файла

1 - от текущей позиции

2 - от конца файла

Выход: CF = 0 и CX:DX - новое значение указателя (в байтах от начала файла),

если не произошла ошибка CF - 1 и АХ = 06h, если неправильный идентификатор

Указатель можно установить за реальными пределами файла: в отрицательное число, тогда следующая операция чтения/записи вызовет ошибку; в положитель­ное число, большее длины файла, тогда очередная операция записи увеличит раз­мер файла. Эта функция также часто используется для определения длины фай­ла - достаточно вызвать ее с СХ - О, DX = О, AL = 2, и в CX:DX будет возвращена

длина файла в байтах.

Функция DOS 40k. Запись в файл или устройство

Вход:   AH = 40h

ВХ = идентификатор СХ = число байтов

DS:DX = адрес буфера с данными Выход: CF = О и АХ = число записанных байтов, если не произошла

CF = 1 и АХ - 05h, если доступ запрещен; 06h, если неправильный иден­тификатор

Если при записи в файл указать СХ = О, он будет обрезан по текущему значе­нию указателя. На самом деле происходит запись в буфер DOS, данные из кото­рого сбрасываются на диск во время закрытия файла или если их количество превышает размер сектора диска. Для немедленной очистки буфера можно ис­пользовать функцию 68h (функция fflush в С).

Функция DOS    Сброс файловых буферов DOS на диск Вход:   АН = 68h

ВХ - идентификатор Выход: CF =    если операция выполнена

CF = 1, если произошла ошибка (АХ = код ошибки)

Для критических участков программ предпочтительнее использовать более эф­фективную функцию ODh.

Функция DOS ODh: Сброс всех файловых буферов на диск Вход: АН = ODh Выход: Никакого