Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Запись в последовательные файлы. Часть 2

ОГЛАВЛЕНИЕ

   Средний уровень.


   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.