Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

1) HFile – хэндл того файла, в котором перемещается указатель.

2) IDistanceToMove – это число символов, на которое необходимо передвинуть указатель файла. Так как тип этого аргумента LONG, то невозможно переместить указатель файла больше, чем на 2*32 байта. Если необходимо передвинуть указатель более чем на 2*32 байта, то в этом случае необходимо воспользоваться третьим аргументом функции, через который можно передать указатель на буфер, содержащий старшие тридцать два разряда требуемого значения.

3) PLONG lpDistanceToMoveHigh указатель на буфер со старшими 32-мя байтами расстояния для перемещения указателя.

Таким образом, при определении нового значения указателя файла используется следующая формула:

НЗУ=СЗУ+ IDistanceToMove+ * lpDistanceToMoveHigh,

Где НЗУ – новое значение указателя;

СЗУ – старое значение указателя;

Функция SetFilePointer возвращает новое значение указателя файла. В том случае, когда 32 разрядов для этого мало, старшие тридцать два разряда записываются по адресу lpDistanceToMoveHigh.

4) dwMoveMethod определяет точку отсчёта для перемещения указателя файла. Возможные значения этого аргумента следующие:

Функция при успешном завершении возвращает новое значение указателя. Но возможны ещё два случая. Во-первых функция может вернуть значение 0хffffffff, при этом слово, на которое указывает третий аргумент может быть нулевым. Это означает, что при работе функции произошла ошибка. Во-вторых функция может вернуть значение 0хffffffff, при этом слово на которое указывает третий аргумент может быть не равно нулю. В этом случае для того, чтобы определить произошла ли ошибка, необходимо вызвать функцию GetLastError(). Если эта функция вернёт значение, отличное от NO_ERROR, то это будет являться сообщением об ошибке.

7) Запись в файл или устройство

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

Ввод:

АН = 40h

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

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

DS:DX = адрес буфера с данными

Вывод:

CF = 0 и АХ = число записанных байт, если не произошла ошибка

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

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

Пример для DOS 13.2. Прямой доступ к файлу. Модифицируем созданный ранее файл в примере 13.1 MYFILE.txt, содержащий строку “Файл номер 1”, в которой следует заменить 1 на 2а.

; В сегменте команд

; Откроем файл

mov AH,3Dh ;Функция открытия файла

mov AL,2 ;Доступ для чтения-записи

mov DX,offset fname ;Адрес имени файла

int 21h

mov handle,AX ;Сохраним дескриптор

;Установим указатель на байт номер 11

mov AH,42h ;Функция установки указателя

mov AL,0 ;Режим - от начала файла

mov BX,handle ;Дескриптор

mov CX, 0 ;Старшая половина указателя

mov DX, 11 ;Младшая половина указателя

int 21h

;Модифицируем файл

mov AH,40h ;Функция записи

mov BX,handle ;Дескриптор

mov CX,2 ;Число записываемых байтов

mov DX,offset mod ;Отсюда выводить

int 21h

;В сегменте данных

mod db '2a' ;Буфер вывода

handle dw 0 ;Ячейка для дескриптора

fname db 'MYFILE.txt', 0 ;Имя файла в формате ASCIIZ

При модификации будет произведена как замена последнего байта файла, так и увеличения длины файла на 1 байт.

Если необходимо задать положение указателя от конца файла, то для этого в параметрах функции 42h следует указать режим 02, а в регистровую пару CX:DX поместить число -1 (так как мы хотим сместиться на 1 байт влево от конца файла); 32- разрядное число -1 имеет машинное представление FFFFFFFFh. Поэтому строки заполнения регистров СХ и DX будут выглядеть следующим образом:

mov CX,0FFFFh

mov DX,0FFFFh

Пример 13.3. Чтение файла

;В сегменте команд

;Откроем файл

mov AH,3Dh ; Функция открытия файла

mov AL,2 ; Доступ для чтения-записи

mov DX,offset fname ; Адрес имени файла

int 21h

mov handle,AX ; Сохраним дескриптор

; Поставим запрос на чтение 80 байт

mov AH,3Fh ; Функция чтения

mov BX,handle ; Дескриптор

mov cx,80 ; сколько читать

mov DX,offset bufin ; СЮда

int 21h

mov CX,AX ; Сколько реально прочитали

; Выведем прочитанное на экран

mov AH,40h ; Функция записи

mov ВX,1 ; Дескриптор стандартного вывода

mov DX,offset bufin ; Отсюда выводить (СХ байт)

int 21h

; В сегменте данных

bufin db 80 dup (' ') ; Буфер ввода

handle dw 0 ; Ячейка для дескриптора

fname db 'MYFILE.001',0 ; Имя файла в формате ASCIIZ

Чтение файла осуществляется вызовом функции 3Fh, которая требует указания в качестве входных параметров дескриптора источника данных (в регистре ВХ), адреса приемного буфера (в регистрах DS:BX) и количества передаваемых байтов (в регистре СХ). Если мы хотим прочитать все содержимое файла, но не знаем точно его длину, можно в запросе на чтение указать заведомо большее число байтов (не более 65 535). Функция 3Fh сама определит длину файла и прочитает все его содержимое до конца. После возврата из DOS в регистре СХ будет содержаться число фактически прочитанных байтов. В примере содержимое АХ переносится в СХ и используется затем в качестве параметра для функции 40h, с помощью которой прочитанные данные выводятся на экран для контроля.