Главная » Basic » ФАЙЛЫ ПРЯМОГО ДОСТУПА В БЕЙСИКЕ ВВС

0

Система ВВС поддерживает работу с файлами прямого доступа при наличии дисковода для гибких дисков. Полный идентификатор файла имеет следующий вид:

: дисковод.имя_справочника.имя_файла где:

дисковод                 номер от 0 до 3, идентифицирующий физический дисковод; имя—справочника   — один символ, идентифицирующий отдельную группу файлов на диске; имя_файла             — имя файла, в состав которого входит до семи символов.

Ниже приведены примеры допустимых имен:

: 1.A.ONEPROG

: 0. $.DATA1

Если имя справочника и номер дисковода не указаны, то по умолчанию подразумеваются текущие значения этих параметров. Эти значения изображаются в распечатке со сведениями обо всех файлах на текущем диске, выдаваемой по команде *САТ. Эти значения могут быть изменены командами

*DIR изменяет текущий справочник файлов *DRIVE изменяет текущий дисковод

Имена файлов в операторах OPENIN и OPENOUT относятся к текущему дисководу и  текущему справочнику.

Оператор OPENIN открывает файл для чтения и записи в режиме прямого доступа, например: 10 N=OPENIN("DAFILE")

10   CHAN=OPENIN(A$)

где А$ содержит имя файла.

При создании файла оператором OPENOUT дисковая файловая система резервирует 64 сектора  по 256 байт, т. е. 16К байт. Для каждого открытого файла в памяти ЭВМ резервируется  буферная область размером в 256 байт. Одновременно могут быть открытыми до пяти файлов. Обмен данными между буфером и диском осуществляется автоматически в зависимости от значения, присвоенного PTR#.

При  работе с файлами прямого доступа можно пользоваться всеми операторами, описанными  в подразд. 8.4.4. и 8.4.7. В дополнение к ним предусмотрены новый файловый оператор и  функция PTR#, позволяющая выбирать для последующего чтения или записи любой байт файла. Тем самым представляется  возможность  прямого  доступа  к  области  хранения  файла  на  байтовом  уровне. Например, оператор

100  PTR#M=10 установит указатель позиции в файле на байт 10, а оператор

100  PTR#M=NUM установит указатель позиции в файл на байт с номером NUM; оператор

100    PTR#M=PTR#M  +  22  переместит указатель файла  на  22  байта  от  предыдущего  значения;

оператор

100  PRINT PTR#M

напечатает  текущее  значение  указателя  файла.  Обмены  данными  между  буфером  и   диском осуществляются в зависимости от значения PTR#. Если оно равно 5000, то в буфер считывается 20-й сектор, содержащий байты с 4864-го по 5119-й, и чтение или запись будут происходить, начиная с байта 5000.  Однако в  пределах буфера указатель файла можно  перемещать, не  вызывая нового обмена с диском. Таким образом, концепция прямого доступа к файлу полностью ориентирована на побайтовую передачу данных. Значения вещественных числовых переменных записываются в пять байтов, а целых — в четыре, и перед каждой такой  серией байтов записывается еще один байт, идентифицирующий тип значения. Строки записываются в виде последовательности составляющих их символов, перед которой  записывается еще Два байта — один для идентификации строкового значения, а другой содержит длину строки. С помощью операторов BGET# и BPUT# значения можно считывать и записывать по одному байту. Оператор BPUT посылает один байт

файл в позицию, определяемую текущим значением указателя файла, а BGET читает байт из файла.

Например, операторы

10  BPUT#N, 8

10   BPUT#N,A$

запишут  значение  8  или  первый  символ  строки  А$  в  позицию  файла,  определяемую  текущим значением указателя. А оператор

10   X$=BGET#N считает байт из файла в Х$.

Если  в  файле  должна  храниться,  нерегулярная  смесь  значений  числовых  переменных,   строк символов и байтов, то часть файла надо выделить под справочник, который будет  считываться в массив  тотчас  же  после  открытия  файла.  В  этом  массиве  должны  регистрироваться начальные позиции всех элементов данных файла. В противном случае  можно хранить формат логической записи с фиксированной длиной, содержащей несколько  элементов. Например, логическая запись длиной в 19 байт может содержать два числовых  значения по 5 байт в каждом и строку из 5 байт вместе  с  однобайтовыми  заголовками  у  числовых  значений  и  двухбайтовым  заголовком  перед строкой. Если номер такой логической записи (0, 1, 2, 3, … ) содержится в переменной REC, то для извлечения требуемой записи в буфер можно воспользоваться оператором

50   PTR#M=REC*19

В  приводимом примере  текущая  позиция  устанавливается на  байт  100  файла  DAFILE,  а  затем печатаются следующие 10 байт (символов) :

10 REM ПРИМЕР РАБОТЫ С ФАЙЛОМ DAFILE

20 N=OPENIN("DAFILE")

30 РТР#N=100

40 FOR I=1 TO 10

50   PRINT GET#N;

60   PTR#N=PTR#N+1

70 NEXT I

80 CLOSE#N

90 END

Операторы INPUT и PRINT действуют последовательным образом, но ими можно пользоваться для чтения и записи данных, начиная с позиции, на которую показывает текущее значение  указателя файла, например:

50   PTR#N=50

60   INPUT#N, А, В, С$

или

50   PTR#N=1000

60   PRINT#N, А, В, С$

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

Файловая функция EXT#(N) возвращает длину файла в байтах: L=EXT#(N)

8 6.4. ФАЙЛЫ ПРЯМОГО ДОСТУПА В. СИСТЕМЕ PET ФИРМЫ COMMODORE

Общий метод доступа к  дисковым файлам в  системе PET, а  именно использование для  канала дисковых команд вторичного адреса 15, считывание реакции на команды по этому же  каналу, и использование для обмена данными каналов 2-14 уже были описаны в подразд. 8.4.6.

При работе с файлами прямого доступа требуется явным образом пользоваться буфером в 256 байт, выделяемым для каждого файла. Для этого с помощью операторов PRINT по каналу команд 15 надо потребовать от дискового контроллера передачи блока с диска в буфер или обратно. Данные могут быть считаны в буфер или записаны из него в файл с помощью операторов INPUT# и PRINT#.

Способ доступа к диску посредством команд довольно сложен. Он выполняется на основе адресации по  дорожкам и  секторам, причем каждый сектор содержит 255  байт данных и  на  35  дорожках стандартного дисковода (модели 3040) помещается от 17 до 21 секторов. Таким  образом, если Вы храните по одной записи в блоке размером 255 байт, то Вам обычно надо ссылаться на конкретную запись по ее номеру, который программа должна преобразовывать в номер дорожки и номер сектора. Максимальное число доступных блоков равно 670. По желанию в одном блоке можно хранить по две записи или более. Так как в буфере предусмотрен указатель,  обеспечивающий чтение или запись отдельных частей буфера, начиная с отмеченной  указателем  позиции, то с его помощью можно получать доступ к отдельным записям из блока. Информация располагается на диске по направлению от внешней дорожки с номером 1 к внутренней дорожке с номером 35 следующим образом: каждая из дорожек с 1-й по 17-ю содержит по 21 сектору; дорожка 18 содержит 20 секторов, но пользоваться ею нельзя, так как на  ней хранится справочник файлов; дорожки с 19-й по 24-ю содержат по 20 секторов, дорожки с 25-й по 30-ю — по 18 секторов, а дорожки с 31-й по 35-ю — по 17 секторов. Всего получается 690 секторов, из которых для данных, за вычетом 20 секторов справочника файлов, остается 670 секторов.

В  дисковой  системе  PET  предусмотрен  богатый  набор  команд,  позволяющих  выполнять  очень сложные манипуляции. Ниже приведена схема работы с диском в предположении, что в  каждом блоке хранится по одной записи. При этом отдельные действия могут быть  реализованы в виде подпрограмм Для применения в больших программах.

(а)  Открыть файл прямого доступа с логическим номером С и для большего удобства со вторичным адресом С в диапазоне 2 … 14:

10  OPENC,8,C"#"                 (открыть файл и зарезервировать буфер) 20  OPEN 15, 8, 15                  (открыть канал команд)

(проверить реакцию системы на наличие ошибки)

(б)  Считать запись. Вначале номер записи преобразуется в номер дорожки и номер сектора S; номер дисковода D должен быть равен 0 или 1:

(преобразовать номер записи в Т и S)

100   PRINT#15,"U1:"C;D;T;S               (считать блок с диска в буфер)

110   PRINT#15,"B-P:"C; 1                      (установить указатель буфера на его начало)

(проверить   реакцию   системы   на   наличие   ошибки)   120           INPUT#C,   список    элементов

(прочитать значение из буфера)

(в) Сделать запись: (преобразовать номер записи в Т и S)

200   PRINT#15,"U1:"C;D;T;S               (считать блок с диска в буфер) 210  PRINT#15,"B-P:"C;1                     (установить указатель буфера на его начало)

(проверить реакцию системы на наличие ошибки) 220   PRINT#С, список элементов             (записать данные в буфер)

230   PRINT#15,"U2:"C; D; T; S                (вывести буфер на диск) (проверить реакцию системы на наличие ошибки)

(г) Закрыть файл:

300   CLOSE С 310   CLOSE 15

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии