Страница 33 из 41 Средний уровень. MS DOS может писать последовательные файлы как методом управ- ляющего блока файла, так и методом дескриптора файлов. Метод FCB предоставляет функцию специально сконструированную для записи последовательных файлов. Метод дескриптора файлов, с другой сто- роны, имеет только функцию записи в файл общего назначения, но ее легко использовать и для этой цели. В любом случае, способ, ко- торым был открыт файл, важен при последовательных операциях. Если данные должны добавляться к последовательному файлу, то должна быть использована обычная функция открытия файла. Однако, если файл должен быть перезаписан заново, то требуется функция "созда- ния" файла. Эта функция обрезает файл до нулевой длины, поэтому его длина будет равна длине записанных в него данных.
Метод FCB: Функция 15H прерывания 21H предназначена для записи в последо- вательный файл. Надо подготовить управляющий блок файла и область обмена с диском, как показано в [5.3.5]. Если файл должен быть перезаписан, то его надо открыть с помощью функции 16H, которая "создает" файл, обрезая его до нулевой длины. Если Вы откроете файл с помощью функции 0FH, то остаток старого файла останется в конце файла, если длина нового файла будет меньше, чем старого. С другой стороны, если Вы хотите добавить данные к файлу, то ис- пользуйте функцию открытия файла. После того как файл открыт, Вы должны установить DS:DX на начало FCB и вызвать функцию 15H для того чтобы заприсать одну запись данных. Количество данных в записи зависит от величины, которая помещена в поле длины записи, расположенное со смещением 14 в обычном FCB, по умолчанию это значение равно 128 байтам. Если размер записи меньше, чем размер сектора диска 512 байт, то данные будут буферизоваться, до тех пор пока не накопится доста- точно данных, чтобы произвести реальную запись на диск; поэтому записи в последовательный файл могут успешно записываться даже если накопитель не включен. При закрытии файла все данные остав- шиеся в буфере сбрасываются на диск. При возврате из функции 15H, AL равен 0, если операция успешна, 1 - если диск полон и 2 - если сегмент области обмена данных слишком мал. В следующем примере на диск записываются 5 записей длиной 256 байтов. Записи могут быть набором текстовых данных. Эти данные расположены в области памяти, помеченной меткой WORKAREA. Указа- тель на DTA первоначально устанавливается на начало этой области, а после записи каждой записи установка DTA меняется таким обра- зом, чтобы он указывал на 256 байтов выше. Отметим, что обычно для такой рабочей области отводится специальная область памяти [1.3.1], но в данном примере для простоты используется буфер расположенный в сегменте данных.
;---в сегменте данных WORKAREA DB 2000 DUP (?) ;буфер данных FCB DB 1,'FILENAMEEXT',25 DUP (0)
;---DTA должен указывать на рабочую область LEA DX,WORKAREA ;DS:DX указывают на DTA MOV DI,DX ;сохраняем копию MOV AH,1AH ;функция установки DTA INT 21H ;устанавливаем DTA ;---открываем файл MOV AH,16H ;номер функции LEA DX,FCB ;DS:DX указывают на FCB INT 21H ;открываем файл ;---устанавливаем размер записи LEA BX,FCB ;BX указывает на FCB MOV AX,256 ;размер записи 256 байтов MOV [BX]+14,AX ;записываем в поле размера записи ;---посылаем данные в файл MOV CX,5 ;число записей NEXT_REC: MOV AH,15H ;функция записи LEA DX,FCB ;указываем на FCB INT 21H ;записываем данные CMP AL,2 ;проверка на ошибки JE CONTINUE ;и их обработка CMP AL,1 ; JE DISK_FULL ; ;---перенос выполнен, переустанавливаем DTA ADD DI,256 ;сдвигаемся на 1 запись MOV DX,DI ;DS:DX указывают на новый DTA MOV AH,1AH ;функция установки DTA INT 21H ;установка новой позиции LOOP NEXT_REC: ;идем на следующую запись
;---позднее, закрываем файл LEA DX,FCB ;DS:DX указывают на FCB MOV AH,10H ;функция закрытия файла INT 21H ;закрываем файл
Метод управляющего блока файла не слишком удобен для добавле- ния записей в конец существующего последовательного файла. В отличии от метода дескриптора файла, который позволяет указать на конец файла, здесь Вы должны манипулировать полями текущей записи и текущего блока. Нужно считать последнюю, несущую информацию, запись в DTA, а затем заполнить пустое пространство в нем первой записью данных, которые Вы хотите добавить. Затем перезапишите запись на ее старое место в файле, после чего Вы можете добавлять сколько хотите новых записей. Файл должен быть открыт функцией 0FH.
|