Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Переместить указатель чтения/записи в Win32




DWORD SetFilePointer(HANDLE hFile,

LONG IDistanceToMove,

PLONG lpDistanceToMoveHigh,

DWORD dwMoveMethod);

 

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, то это будет являться сообщением об ошибке.

 


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

Функция 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, с помощью которой прочитанные данные выводятся на экран для контроля.


Закрыть файл

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...