12. Файлы с последовэательным и произвольным доступами.
12.1. Общее описание.
В последнем разделе обсуждались обычные массивы файлов данных.
TRDOS обеспечивает два дополнительных типа файлов данных - последо-
вательного и произвольного доступа.
Чтобы использовать эти два типа файлов данных, сначала вы долж-
ны открыть поток. В SPECTRUM содержится 16 потоков. SOS резервирует
потоки от 0 до 3 для своего собственного использования, а потоки от
4 до 15 доступны для TRDOS. Когда открыт поток для файла с последо-
вательным или произвольным доступами, используется 336 байт памяти
произвольного доступа.
В файле данных могут храниться как числовые, так и строковые
переменные. Компьютер преобразует числовые переменные в строки.
Строка заканчивается системно возвратом каретки (ASC!! CODE 13).
Данные файла с последовательным доступом записываются по поряд-
ку, как на ленту. Чтобы считать цепочку по направлению к концу фай-
ла, необходимо начать с самого начала файла. Данные файла с произ-
вольным доступом хранятся в виде некоторого количества записей. Мож-
но считать или записать любую запись в этом файле, указав ее номер.
Следовательно доступ к последней записи можно осуществить так ъже
быстро как и к первой.
Другие команды TRDOS по выбору дисковода, копированию, измене-
нию названий и т. д. все одинаково пухрименяются к файлам последова-
тельного и произвольного доступов. Единственная разница- в типе ин-
дикатора файла, который представляет собой "#" вместо "CODE" или "DA-
TA". Например:
COPY "B:PHONE","A:PHONE"#
NEW "NEWFILE","OLDFILE"#
ERASE "NAMEDD"#
Как ифайлы данных, файлы последовательного и произвольного
доступов редко управляются непосредственно с TRDOS. Поэтому предпо-
лагается, что нижеследующие примеры находятся в программе BASIC.
12.2. Последовательные файлы.
Последовательный файл может быть открыт для записи или считыва-
ния, но не для обеих этих операций в одно и то же время. Синтаксис
для открытия файла для WRITE (записи) следующий:
OPEN STREAM NUVBER,"FILENAME",W
Когда поток открыт для записи, ключевое слово программы BASIC
PRINT используется для записи данных в этот поток. Например:
10LET DOS=15619
20RANDOMIZE USR DOS:REM:OPEN #4,"TEST",W
30PRINT#4;"THIS IS A TEST LINE"
40RANDOMIZE USR DOS:REM:CLOSE#4
Обратите внимание на "DOS" вместо печати в "15619" и закрытия
файла. Цепочка в строке 30 будет записана в файле "TEST" на диске.
Если бы файл не был закрыт, данные были бы потеряны. Любой зак-
рытый файл может быть повторно открыт для дальнейшей операции за-
пись с помощью считывания, изменения и повторной записи под новым
названием.
Синтаксис для чтения открытого файла:
OPEN STREAM NUMBER,"FILENAME",R
При открытом потоке для READ используется ключевое слово SOS
INPUT для считывания данных из этого потока, например:
10LET DOS=15619
20RANDOMIZE USR DOS:REM:OPEN#7,"TEST",R
30 INPUT #7;AS
Этот файл данных "TEST" будет загружен в AS с диска.
12.3. Файлы с произвольным доступом.
Файл с произвольным доступом- это файл данных, который
содержит некоторое количество записей, пронумерованных от 0 и выше.
Длина записей (макс. 254 байта каждая) выбирается и распределяется
при первом открытии файла. Запись храниться в виде отдельной
строки. Любая строка, длина которой меньше длины распределенной
записи, записывается, выравнивается слева и завершается с помощью
возврата каретки (ASC CODE 13). Оставшиеся байты записи теряются.
Любая строка, длина которой больше длины записи, будет усечена до
распределенной длины и записана без вэиозврата каретки.
Когда файл произвольного доступа впервые открывается, TRDOS
распределяет 16 секторов (примерно 4К) в этот файл. Он будет
автоматически расширятся, если длина файла превысит 4К.
Для открытия файла произвольного доступа используется
следующий синтаксис:
OPEN STREAM_NUMBER","FILENAME"RND,RECORD_LENGHT
Для записи в файл существует следующий синтаксис команды (пре-
фикс RANDOMIZE не требуется для распечатки и ввода: PRINT и INPUT):
PRINT STREAM_NUMBER;RECORD_NUMBER,VARIABLE_NAME
Например:
100RANDOMIZE USR 15619:REM:OPEN#8,"ADDRESS"RND,100
150PRINT#8;72,DS
Поток 8 был открыт для файла "ADDRESS" в котором под каждую за-
пись назначено 100 байт. Содержание DS было помещено в запись номер
72 этого файла.
В отличии от последовательного файла,в этом случае можно считы-
вать файл и делать в него запись,когда файл открыт.Для считывания
записи из файла используется следующий синтаксис команд:
INPUT STREAM_NUMBER:(RECORD_NUMBER),VARIABLE_NAME
Например:
100 RANDOMIZE USR 15619:REM:OPEN@12,"TEST"RND,20
110 PRINT #12,20,AS
.
.
.
570 INPUT#12;(15),AS
.
.
.
990 RANDOMIZE USR 15619:REM:CLOSE#12
999 END
В строке 570 считывается запись с номером записи 15(помни-
те,что это 16-я запись) и загружается в переменную AS.
Когда все операции с файлом закончены,поток необходимо зак-
рыть,как указано в строке 990.Если электоэнергия будут отключена до
закрытия потока,то содержание будет утрачено.Одна запись может со-
держать более одной переменной.Программа должна связывать вместе це-
почки этих переменных для произведения операции записи.Таким же об-
разом,программа должна разбить цепочку послле операции чтения,если
данные должны быть снова разделены на отдельные переменные.
13. Непосредственная запись/чтение сектора.
Наряду с тремя типами файлами данных,описанных в последних
двух разделах,TRDOS предлагает также считывание/запись файла DIRECT
SECTOR.Один сектор на диске содержит 256 байтов.
13.1. Команда PEEK.
Команда PEEK дает вам возможность считывать любую часть файла
на диске и переносить данные в память с произвольным доступом.Вы
можете считывать только один сектор за раз,и данные могут быть пере-
даны в любое место в памяти с произвольным доступом.Синтаксис ко-
манд следующий:
PEEK"FILENAME"BUFFER ADRESS,SECTOR NUMBER
Например:
PEEK "RECORD"30023,5
В этом примере 5-сектор файла "RECORD" считывается,и его содер-
жание записывается в память с произвольным доступом из адреса 30023.
13.2. Команда POKE.
Команда POKE дает вам возможность записать сектор данных из па-
мяти с произвольным доступом в любое место в файле на диске.Синтак-
сис-такой же ,как синтаксис команды PEEK:
POKE"FILENAME"BUFFER ADDRESS,SECTOR NUMBER
Например:
POKE "B:OLD"30024,10
В этом примере длина сектора данных,начиная с адреса RAM (па-
мять с произвольным доступом) 30024,записывается в десятый сектор
файла "OLD" в дисководе B:.Т.к эта команда изменяет содержание фай-
ла на диске,ее следует использовать осторожно.