-c1E
-ГЛАВА 9. ФАЙЛОВЫЕ СРЕДСТВА MSX-BASIC
-
-
+\/d
+ГЛАВА IX. ФАЙЛОВЫЕ СРЕДСТВА MSX-BASIC
+\/d-
Ф а й л (от англ. file - досье, картотека), набор данных,-
1) совокупность упорядоченных и взаимосвязанных записей,
минающих устройствах (внешней памяти) и рассматриваемая в
процессе пересылки и обработки как единое целое.
Математический Энциклопедический Словарь
-
-
В персональном компьютере "YAMAHA" предусмотрена работа с двумя версия-
ми языка BASIC: MSX-BASIC и MSX-Disk-BASIC. Версия языка MSX-BASIC преду-
сматривает работу только с накопителем на магнитной ленте, а в версии MSX-
варианте при включении запускается MSX-Disk BASIC, а приоритетным устрой-
ством внешней памяти является дисковод А:.
Работая на компьютере без дисковода, Вы запускаете при включении MSX-
-BASIC, а приориритетным устройством является кассетный магнитофон (CAS:),
+BASIC, а приоритетным устройством является кассетный магнитофон (CAS:),
имя которого может опускаться.
З а м е ч а н и е. В СССР распространены две версии языка MSX-BASIC:
α) версия 1.0 (на компьютерах серии MSX-1);
│ 2.1 │ 1 │
└───────────────┴────────────────────┘
-
-
IX.1. Р а б о т а с ф а й л а м и на д и с к е т а х
Под словом "д а н н ы е" мы будем подразумевать содержимое памяти ком-
емых на внешних носителях информации - кассете магнитной ленты или гибком
магнитном диске (д и с к е т е).
-
IX.1.1. Ф о р м а т и р о в а н и е д и с к е т ы
Дискеты бывают следующих типов:
└────────────────────────────────────────────────────────────────┘
Приведем некоторые характеристики дискеты MF2-DD :
1) емкость при записи:
- a) всего - 730 Кбайт;
- b) для файлов пользователя - 713 Кбайт;
+ a) всего - 730 Кбайтов;
+ b) для файлов пользователя - 713 Кбайтов;
2) плотность при записи - 8717 бит/дюйм;
3) среднее время доступа - 95 MS ;
4) максимальное количество файлов - 112.
Для подготовки диска к работе с командами и функциями MSX-Disk BASIC
необходимо осуществить специальную разметку его поверхности, называемую
ф о р м а т и р о в а н и е м. Для этого дискета вставляется в карман дис-
-ковода и выполняется команда
+ковода, и выполняется команда
┌─────────────────────┐
│ CALL FORMAT │,
└─────────────────────┘
пользователь обязан отреагировать вводом 1, если диск - двусторонний,
или 2, если диск - односторонний.
- Далее, по указанию
+ Далее по указанию
Strike a key when ready █
нажмите любую клавишу. После этого начинается процесс форматирования, то
есть размещение на диске управляющих меток. При этом ранее имевшаяся там
Особую осторожность надо соблюдать при нанесении надписей на наклейке,
прикрепленной к дискете,так как даже давление карандаша или шариковой руч-
ки может оказаться достаточным,чтобы через защитный конверт повредить маг-
-нитный слой дискеты. Во избежании порчи информации,записанной на дискетах,
+нитный слой дискеты. Во избежание порчи информации,записанной на дискетах,
последние следует хранить подальше от телевизоров, видеомониторов, звоня-
щих телефонов и других источников магнитных полей;
2. Для защиты файлов, сохраненных на дискете, позаботьтесь о создании
Кроме того, десятичной точкой имя можно разделить на две зоны: к о -
р е н ь (до точки) и р а с ш и р е н и е (после точки). Расширение со-
-стоит не более, чем из трех символов. Номер начальной позиции корня - 1,а
+стоит не более чем из трех символов. Номер начальной позиции корня - 1, а
расширения - 10.
Если пользователь фиксирует имя без расширения с количеством символов,
большим 8, то компьютер автоматически разбивает его на корень и расшире-
Сообщение об ошибке "Bad file name"
("Н е д о п у с т и м о е и м я ф а й л а")
появляется в том случае, когда имя файла содержит более в о с ь м и сим-
-волов перед явно указанным расширением; если же расширение состоит более,
+волов перед явно указанным расширением; если же расширение состоит более
чем из т р е х символов, то интерпретатор игнорирует лишние символы.
-
П р и м е р ы. ┌──────────────┬────────────────────┐
───────────── │ Имя, заданное│ Представление имени│
│ пользователем│ в компьютере │
│ВАЛ.процент │ ВАЛ .про │
│ ПРОТИВОГАЗ │ ПРОТИВОГ.АЗ │
└──────────────┴────────────────────┘
-
Общепринято, что расширение имени файла должно обозначать его тип.
Обычно применяются следующие стандартные расширения имен:
┌────────────┬───────────────────────────────────────────────────────┐
│ .TMP │ Временный файл │
│ .TXT │ Текстовый файл │
└────────────┴───────────────────────────────────────────────────────┘
-
М а л е н ь к а я х и т р о с т ь. Оградить Ваш файл от посторонних
-взглядов можно, дав ему секретное имя AAAAAAAA.AAA,например. Секрет здесь
+взглядов можно, дав ему секретное имя, AAAAAAAA.AAA например.Секрет здесь
в том, что в этом имени часть букв A из русского, а часть - из латинского
алфавита, и об этом знает только хозяин файла.
В большинстве случаев желательно, чтобы присвоенные файлам имена были
Отметим, что *.* - родовое имя файлов с любыми именами.
-
IX.1.3. С п р а в о ч н а я и н ф о р м а ц и я о ф а й л а х
-
Старейшим из дошедших до нас каталогов признается
список литературных произведений на шумерской гли-
няной плитке, относящейся к 2000 г. до н.э. .
- А.И.Михайлов
-
-
+ А.Михайлов
Сейчас мы расскажем Вам о довольно простых средствах для получения спи-
ска имен файлов, размещенных на дискете (FILES), размера ее свободной час-
ти (DSKF) и некоторой другой справочной информации.
Если параметр I указан и на диске имеется файл с этим именем,то данный
факт подтверждается выводом единственного имени I (в противном случае Вы
прочтете неприятное сообщение: "File not found").
-
П р и м е р ы. FILES 100 FILES
───────────── FILES "Игры" LFILES
-
┌───────────────┐
Функция │ DSKF(n) │ ,
└───────────────┘
скете, находящейся в дисководе A;
если значение n = 2, то Вы получите информацию о свободном месте на ди-
скете, находящейся в дисководе B.
-
П р и м е р ы. α) PRINT DSKF(0):PRINT DSKF(1):PRINT DSKF(2)
───────────── β) X=1:PRINT DSKF(X)
γ) IF DSKF(0)>200 THEN 1000
│ OPEN "И м я ф а й л а" FOR INPUT AS#1:PRINT LOF(1):CLOSE #1 │
└──────────────────────────────────────────────────────────────────┘
-
IX.1.4 О п е р а т о р ы NAME, COPY и KILL
Изменение имени программного файла или файла данных производится по ко-
При задании имени J разрешено использование символов "?". Но при реаль-
ном формировании имени J на дискете каждый такой символ будет заменен на
элемент из соответствующей позиции имени I.
-
П р и м е р ы. α) NAME "алфавит" AS "АЛФ"
───────────── β) name X$ as "X.1"
γ) 200 NAME "PQR.XYZ" AS "?.?11"
В последнем случае новое имя будет выглядеть так:
-
Р ▲ .Х11
│
7 пробелов
Для дублирования на дисках программных файлов и файлов данных применя-
ется команда (оператор) ┌─────────────────────┐
- │ COPY i TO j │
+ │ COPY i TO j │ ,
└─────────────────────┘
где: 1) COPY ("копировать"),ТО("в") - служебные слова;
2) i - строковое выражение, значение которого определяет имя исход-
файла с именем j заменяется на содержимое файла с именем i и, естественно,
"старое" содержимое файла с именем j пропадает!
Если i или j - файлы данных, то они не должны быть открыты!
-
П р и м е р ы. α) COPY "AL" TO "LA"
───────────── β) COPY "X" TO "X.1"
γ) 10 SAVE "U.1"
нию (стиранию) подвергается лишь справочная информация о файле.
Если I - имя файла данных, то при выполнении команды KILL он не должен
быть открыт.
-
П р и м е р ы. α) KILL"Бочка":KILL"R.T"
───────────── β) X$="ЮюЮ":KILL X$
γ) 100 FOR K=1 TO 25:KILL"ЦЕХ."+MID$(STR$(K),2):NEXT
+
IX.1.5. О п е р а т о р ы LOAD, SAVE, RUN и MERGE
┌──────────────────┐
α) в кодах ASCII:
10 X=1
β) во внутреннем представлении (по кодам):
-
FF 09 80 0A 00 58 EF 12 00 00 00 .
── ───▲─── ───▲─── ── ▲ ── ─▲ ───▲───
Начало ▲ │ │ ▲ │ ▲ │ └ Конец
программы ┘ Адрес следу- Номер └ X = 1 ┘ Конец программы
ющей строки строки (10) строки
-
┌───────────────────────────────────────────────────────────────────────┐
│ Если данная программа впоследствии будет погружаться в память для сли-│
│ яния с другими программными модулями, то ее необходимо записывать в │
│ коде ASCII. │
└───────────────────────────────────────────────────────────────────────┘
- Заметим что формат ASCII приводит к увеличению в несколько раз времени
+ Заметим,что формат ASCII приводит к увеличению в несколько раз времени
записи программ из оперативной памяти на дискету, а также их чтения с дис-
кеты в память. К тому же для их размещения на дискете требуется приблизи-
тельно на 30% больше места, чем для соответствующих программ, написанных
записи на него новой программы под тем же именем, старый файл пропадает и
происходит изменение размера свободной части диска в соответствии с новы-
ми размерами файла с именем I.
-
П р и м е р ы. α) SAVE"PROTOOL.SYS"
───────────── β) X$="Z80.ABC":SAVE X$:SAVE"PRIMER.BAS",A
γ) 10 FOR M=1 TO 30:SAVE"палата"+MID$(STR$(М),2):NEXT
Для считывания программ с дискеты в оперативную память используются
команды (операторы) LOAD и RUN.
-
1. По команде ┌───────────────┐
│ LOAD I[,R] │ ,
└───────────────┘
I - строковое выражение, значение которого определяет имя файла;
R - необязательный параметр;
прежде всего закрываются все файлы и оперативная память очищается от
-программ и данных. Далее, программа, записанная на дискете в машинных ко-
+программ и данных. Далее программа, записанная на дискете в машинных ко-
дах или формате ASCII под именем I, загружается в оперативную память.
При наличии параметра R после загрузки производится запуск программы
на счет.
-
П р и м е р ы. α) LOAD"X.Y"
───────────── β) Z$=MID$(A$,5,3):LOAD Z$,R
┌──────────────────────────────────────────────────────────────┐
в оперативную память загружается и запускается на счет программа, записан-
ная на диске под именем I в машинных кодах или в формате ASCII.
При отсутствии параметра R перед загрузкой файла с именем I закрывают-
-ся все открытые файлы и память очищается от программ и данных.
+ся все открытые файлы, и память очищается от программ и данных.
При наличии параметра R из памяти удаляются программы и значения пере-
менных. Однако файлы данных н е з а к р ы в а ю т с я !
-
П р и м е р [5].
───────────────
1 'Меню многомодульного файла "MMF"
15 RUN"прог.В",R
16 RUN"прог.С",R
17 RUN"прог.Д",R
- Приведем вид отдельного модуля, например, модуля с именем "прог.А":
+ Приведем вид отдельного модуля, например модуля с именем "прог.А":
10 PRINT"Выполняется программа А"
20 RUN"ММF",R
└────────────────────────────────────────────────────────────────┘
Далее производится слияние программы А, находящейся в памяти, с про-
граммным файлом, записанным на диске в формате ASCII под именем I.
-
П р и м е р ы. α) MERGE "TTT"
───────────── β) L$="техника":MERGE L$
γ) 100 MERGE "LIST.3"
Обратите внимание на тот факт,что программы, вызываемые командой MERGE,
-имеют более высокий приоритет, по сравнению с программами, находящимися в
+имеют более высокий приоритет по сравнению с программами, находящимися в
памяти компьютера. Поэтому если в объединяемых программах имеются строки
с одинаковыми номерами, то строки программы в памяти компьютера будут за-
менены соответствующими строками "добавляемой" программы с именем I.
Наиболее целесообразно использовать этот оператор при работе с библио-
теками подпрограмм на магнитной ленте или на дискете. Покажем, как это де-
лается.
-
П р и м е р. Предположим, что программа,находящаяся в памяти,занимает
──────────── строки с 10 по 1290. Для добавления подпрограммы, назван-
ной при записи на дискету "ROUT1" и занимающей строки с 10 по 190,сначала
Вы должны сохранить программу, находящуюся в памяти.
- После этого, Вы вызываете подпрограмму "ROUT1", используя команды LOAD
+ После этого Вы вызываете подпрограмму "ROUT1", используя команды LOAD
или CLOAD.
Теперь используйте команду RENUM для перенумерации строк подпрограммы,
начиная, например, со строки 10000.
приведет к тому, что в конце текста основной программы будет добавлен
текст подпрограммы с номерами строк, начинающимися с 10000.
- IX.2. Ф а й л ы д а н н ы х п р я м о г о д о с т у п а
+ IX.2. Ф а й л ы д а н н ы х п р я м о г о д о с т у п а
Я знаю, что положил это в надежное место,
но теперь не могу вспомнить,в какое именно!
Из диалога на приеме у врача
-
Как мы уже отмечали (см. главу V), файл данных п р я м о г о доступа
представляет собой последовательность нумерованных групп значений, называ-
емых з а п и с я м и.
которому во внутреннем справочнике находится ее фактическое положение на
дискете, что позволяет немедленно произвести чтение или запись. Таким об-
разом осуществляется прямой доступ к записям, требующий примерно одного
+
+
+
и того же небольшого (зависящего от скорости вращения дискеты) времени
для всех записей.┌──────────────────────────────┐ ┌──────────────────┐
│ ◀───▶ Запись с данными │
IX.2.1. К о н т р о л ь н ы е б у ф е р ы ф а й л о в
-
┌───────────────┐
Оператор │ MAXFILES=A │ ,
└───────────────┘
265 265
Ok
Взгляните на схему расположения информации в FCBn :
-
Управляющая информация ────┐ Д а н н ы е
┌───┬───┬─▼─┬───┬───┬───┬───┐
│▧▧▧│▧▧▧│···│▧▧▧│███│···│███│
│
Байт, адрес которого возвращает функция VARPTR(#n)
-
К о н т р о л ь н ы й б у ф е р ф а й л а (FCB)
┌─────┬────────┬──────────────────────────────────────┐
│Номер│ И м я │ С о д е р ж и м о е │
│ │ │ 2 - OPEN FOR APPEND (для диска) │
│ │ │ 4 - файл прямого доступа (для диска) │
│ │ │ 4 - файл последовательного доступа, │
- │ │ │ открытый и для чтения, и для записи, │
- │ │ │ например, OPEN "COM:" AS#1 │
+ │ │ │ открытый для чтения и для записи, │
+ │ │ │ например OPEN "COM:" AS#1 │
│ │ │ 8 - OPEN FOR APPEND │
│ │ │ (для устройства MEM:) │
├─────┼────────┼──────────────────────────────────────┤
│ С п е ц и ф и к а ц и я ф а й л а
│ ┌─────┬────────────────────────────────────────────────┬──────────┐
│ │Номер│ С о д е р ж и м о е │Количество│
- │ │байта│ б а й т о в │ байтов │
+ │ │байта│ б а й т а │ байтов │
│ ├─────┼────────────────────────────────────────────────┼──────────┤
└──▶│ +00 │ Н о м е р дисковода (0 - по умолчанию, 1 - A:)│ 1 │
│ +01 │ │ │
│ Заметим, что этот оператор будет выполнен только в том случае, │
│ если файл был предварительно открыт. │
└─────────────────────────────────────────────────────────────────┘
-
П р и м е р 1. В качестве примера рассмотрим файл с прямым доступом,со-
───────────── держащий информацию о личной библиотеке. Каждая запись
содержит следующую информацию:
Отметим, что разрешается использовать несколько команд FIELD с разными
форматами для одного и того же буфера n. Всегда действует то разбиение
FCBn на поля, которое предложено последней выполненной командой FIELD.
-
П р и м е р 2.
─────────────
10 MAXFILES=3:OPEN"Student" AS#2 LEN=40
│ T │ Лучший результат │ 4 │ Вещ. число │
└──────────────┴────────────────────────┴──────────────────┴────────────┘
Итого: 64
-
Длина и тип каждого поля указаны вместе с переменными, которые в Вашей
программе будут хранить данные, извлеченные из записей. Совершенно необя-
зательно использовать одни и те же переменные во всех программах, обращаю-
байты заполняются пробелами. Таким образом, операторы LSET и RSET гаранти-
руют, что длина значения переменной будет приведена в соответствие с дли-
ной, указанной в операторе FIELD.
-
П р и м е р 1. 10 OPEN "EF" AS#1 LEN=9
───────────── 20 FIELD #1,5 AS M$,14 AS L$
30 INPUT R$:LSET M$=R$
НЕБОСВОД └───┴───┴───┴───┴───┴
Ok 5 байтов
-
П р и м е р 2. Приведем фрагмент программы, в котором формируется за-
───────────── пись файла, содержащего информацию о личной библиотеке.
В буфер заносится информация о романе Л.Н.Толстого "Война и мир". Структу-
80 LSET DATE$="10.5.1988"
Команды LSET и RSET можно использовать не только при работе с файлами.
-
П р и м е р 3. 10 L$=SPACE$(20):Z$="Волк"
───────────── 20 RSET L$=Z$:PRINT L$
+
IX.2.5. Ф у н к ц и и MKI$(), MKS$(), MKD$(), CVI(), CVS(), CVD()
Вам, конечно, известно, что буферные переменные являются строковыми.
ной m байтов. Если требуется "упаковать" в γ числовое значение,то поль-
зуются функциями:
┌────────────────────────────────────────────────────────────┐
- α) │ MKI$(L) │
+ α) │ MKI$(L) , │
│ где: MKI("MaKe Integer"-"преобразовать целое значение") │
│ - служебное слово; │
│ L - арифметическое выражение целого типа; │
│ m=2 │;
└────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────┐
- β) │ MKS$(L) │
+ β) │ MKS$(L) , │
│ где: MKS("MaKe Single"-"преобразовать значение одинарной │
│ точности") - служебное слово; │
│ L - арифметическое выражение одинарной точности; │
│ m=4 │;
└────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────┐
- γ) │ MKD$(L) │
+ γ) │ MKD$(L) , │
│ где: MKD ("MaKe Double"-"преобразовать значение двойной │
│ точности") - служебное слово; │
│ L - арифметическое выражение двойной точности; │
оперативной памяти. Именно поэтому с помощью оператора PRINT невозможно
выдать на печать или экран дисплея результаты работы функций MKI$(),
MKS$() и MKD$() !
-
П р и м е р 1.
──────────────
α) функция MKI$(17217) возвращает строку "AC". Рассмотрим, как это по-
лучается:
-
17217=&B0100001101000001=&H4341=&H43·256+&H41=67·256+65
└──────┘└──────┘ ▲ ▲
C A │ └─ Код символа "A"
└──────── Код символа "C"
-
β) MKS$(4.14141) возвращает строку "AAAA"
-
П р и м е р 2. A$=MKI$(&HE276):PRINT HEX$(ASC(MID$(A$,1,1)));" ";
────────────── HEX$(ASC(MID$(A$,2,1)))
76 E2
Ok
-
П р и м е р 3. 10 MAXFILES=5:OPEN "LU" AS#4
────────────── 20 FIELD #4, 2 AS A$, 4 AS B$, 8 AS E$
30 INPUT X%:LSET A$=MKI$(X%)
H A5 a4
H A5 a4
Ok
-
Функции MKI$(),MKS() и MKD() выполняют обратное преобразование по отно-
шению к функциям CVI(), CVS() и CVD(), к рассмотрению которых мы сейчас
приступаем.
- Пусть в буфер с дискеты считана запись и в некотором ее поле,определен-
+ Пусть в буфер с дискеты считана запись,и в некотором ее поле,определен-
ном по команде FIELD элементом
m AS γ
-"упаковано" числовое значение. "Распаковка" его или, выборка из γ этого
+"упаковано" числовое значение. "Распаковка" его, или выборка из γ этого
значения, реализуется одной из следующих функций:
┌────────────────────────────────────────────────────────────┐
- α) │ CVI(γ) │
+ α) │ CVI(γ) , │
│где: CVI("ConVert to Integer"-"преобразовать к целому")- │
│ служебное слово; │
│ γ - имя буферной переменной; │
│ m=2 │;
└────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────┐
- β) │ CVS(γ) │
+ β) │ CVS(γ) , │
│где: CVS("ConVert to Single"-"преобразовать к значению оди-│
│ нарной точности") - служебное слово; │
│ γ - имя буферной переменной; │
│ m=4 │;
└────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────┐
- γ) │ CVD(γ) │
+ γ) │ CVD(γ) , │
│где: CVD("ConVert to Double"- "преобразовать к значению │
│ двойной точности") - служебное слово; │
│ γ - имя буферной переменной; │
└────────────────────────────────────────────────────────────┘
Эти функции преобразуют строки символов в числа. Аргумент состоит из 2,
4 или 8 байтов и преобразуется в целое число, либо число с одинарной или
-двойной точностью, в зависимости от вида используемой функции (CVI, CVS
+двойной точностью в зависимости от вида используемой функции (CVI, CVS
или CVD).
П р и м е р 4.
5759460 ,так как GWYF
Ok Ok
Посмотрите на схему...
-
"G" "W" "Y" "F"
0100 0111 0101 0111 0101 1001 0100 0110
▲───▲──── 5 7 5 9 4 6
│ │
│ Порядок числа = &B1000111-&B1000000 = &B111 = 7
Знак числа
-
Сравните эти результаты с представлением чисел в памяти компьютера (см.
-далее главу 10).
-
+далее главу X).
П р и м е р 5.
──────────────
10 OPEN "SL" AS#1 LEN=8:FIELD #1,8 AS R$
C0 123
Ok
-
-
IX.2.6. О п е р а т о р ы PUT и GET
Для пересылки ("сброса") сформированной в оперативной памяти записи на
новая или о б н о в л е н а старая запись Р файла В.
При открытии файла значение Р равно 0. Т е к у щ и м значением Р счи-
тается номер той записи, с которой работал последний выполненный оператор
-PUT или GET. Далее, если в операторе PUT параметр Р не указан, то берется
+PUT или GET. Далее если в операторе PUT параметр Р не указан, то берется
его текущее значение, увеличенное на 1.
Например, в операторе PUT #1,3
второе число (3) определяет номер записи в файле. Если этот номер будет
-пропущен, то будет использовано число, на единицу большее,чем в последнем
+пропущен, то будет использовано число на единицу большее чем в последнем
выполненном операторе PUT или GET.
Номер записи может находиться в диапазоне от 1 до 4294967295, в чем Вы
можете убедиться самостоятельно.
-
П р и м е р 1. 10 REM формирование файла
────────────── 20 MAXFILES=2:OPEN"массив" AS#2 LEN=8:FIELD #2,8 AS M
+
50 FOR I=1 TO 30
60 INPUT"Введите число";А:LSET M=MKD$(A):PUT #2
90 NEXT
100 CLOSE #2
-
П р и м е р 2. 10 'Объявление FCB0, FCB1, FCB2 и FCB3
────────────── 20 'Открытие файла "рыба" с буфером #2
30 MAXFILES=3:OPEN "Рыба" AS#2 LEN=13
80 INPUT"X$-8";X$:INPUT"Y$-5";Y$
90 LSET L$=X$:RSET M$=Y$:PUT #2,K
99 NEXT:END
-
Пусть открыт некоторый файл данных, связанный с буфером FCBn. Полезную
информацию о файле можно извлечь с помощью функций LOF и LOC.
┌──────────────┐
файла #1 в буфер полей.
Если в записи оператора параметр Р отсутствует, то берется текущее зна-
чение этого параметра, увеличенное на единицу (как и в операторе PUT).
-
П р и м е р 3. 10 REM Считывание из файла "Массив"
────────────── 20 MAXFILES=2:OPEN"Массив" AS#2 LEN=8:FIELD 2,8 AS M
50 FOR I=30 TO 1 STEP-1
60 GET 2,I:PRINT CVD(M);
80 NEXT
+
П р и м е р 4.
──────────────
1 OPEN"числа" AS#1 LEN=10
13 FOR I=1 TO 5:A(I)=CVI(B$(I)):NEXT I
18 P=1:FOR T=1 TO 5:P=P+A(T):NEXT T
19 PRINT P:CLOSE #1:END
-
П р и м е р 5.
──────────────
10 CLOSE:OPEN"числа" AS#1 LEN=25
110 GET#1,1:U$=""
120 FOR T=1 TO 5:U$=U$+B$(T):NEXT T
150 PRINT"Сумма:";U$
-
П р и м е р 6.
──────────────
10 CLOSE:OPEN"числа" AS#1 LEN=25
150 U$=U$+STR$(CVS(B$(T)))+B$(T+1):NEXT
160 PRINT"Сумма:";U$
+
+
+
Отметим ключевой момент при работе с файлами п р я м о г о доступа:
отслеживание "невидимых" указателей. Их два: для дискеты и для буфера.
Первый указатель содержит ссылку на текущую запись и задается номером
│ присваиванием ей некоторого номера (оператором PUT) │
│ F. Файл F з а к р ы в а е т с я (оператором CLOSE) │
└────────────────────────────────────────────────────────────────────┘
-
П р и м е р 7. Запись слова в файл прямого доступа.
──────────────
10 MAXFILES=2:OPEN "EASY" AS#2:FIELD #2,18 AS N$,110 AS D$
│ └────────────────────────────────────────────────────────────┘│
│ F. Файл F з а к р ы в а е т с я (оператором CLOSE) │
└────────────────────────────────────────────────────────────────────┘
-
П р и м е р 8. Чтение слова из файла прямого доступа.
──────────────
10 MAXFILES=2:OPEN "EASY" AS#2:FIELD #2,18 AS N$,110 AS D$
run
Психокомпьютерапия
Ok
-
В заключении этого пункта приведем примеры, иллюстрирующие действие
изученных Вами операторов и функций при работе с дисковыми файлами данных
прямого доступа.
-
П р и м е р 9.
──────────────
5 CLS
65 NEXT:CLS
66 FOR I=1 TO N
70 GET #1,I:IF O$="5" OR O$="4" THEN PRINT G$,F$;O$
- 80 NEXT
- 90 CLOSE #1
+ 80 NEXT:CLOSE #1
П р и м е р 10. Дана таблица:
───────────────
195 PRINT"Ф.И. успевающих"
200 FOR I=1 TO B:GET#3,I:PRINT F1$:NEXT I:END 'Вывод на экран
+
П р и м е р 11.
───────────────
10 MAXFILES=3:OPEN"A3" AS#2 LEN=2:FIELD #2,2 AS K$
20 POKE VARPTR(#2)+9,66:POKE VARPTR(#2)+10,65 'Вместо LSET K$="ba"
+
30 PUT #2,2:CLOSE#2
40 OPEN"a3"AS#2 LEN=2:FIELD #2,2 AS K$:GET #2,2:CLOSE #2
run
или только для записи, но не для одновременного выполнения этих операций.
Для работы с файлами данных п о с л е д о в а т е л ь н о г о доступа
в MSX-Disk BASIC предусмотрен ряд операторов и функций.
-
IX.3.1. О п е р а т о р ы MAXFILES= , OPEN и CLOSE
Перемещение логических строк последовательных файлов из оперативной па-
Учтите,что при использовании оператора MAXFILES= автоматически выполня-
ется оператор CLEAR, но если Вы используете в программе оба оператора, то
располагайте оператор MAXFILES= вслед за оператором CLEAR.
+
+
+
+
Вам, конечно же, ясно, что перед использованием файла Вы должны объя-
вить его о т к р ы т ы м . Открытие файла осуществляется оператором OPEN,
в котором задается:
("присоединение") - служебные слова;
В - строковое выражение, значение которого задает имя устройства и
имя файла.
+
+
+
+
+
┌──────────────────────────────────────────────────────────────────────┐
│ Сейчас мы познакомим Вас с именами у с т р о й с т в: │
│ α) устройство CRT: отвечает за вывод информации на т е к с т о - │
│ б у ф е р │──OUTPUT──▶ Д и с к е т а │
│ ф а й л а │──APPEND──▶ │
└───────────────────────────┘ └───────────────────────┘
-
Оператор OPEN с параметром FOR OUTPUT создает новый дисковый файл с за-
данным именем. Если файл с таким именем уже есть,то он автоматически уни-
чтожается и создается новый файл с тем же именем.
Модификация оператора с параметром FOR INPUT реализует поиск данных с
конкретным именем, отсутствие которого означает ошибку.
+
+
+
П р и м е р ы:
─────────────
α) OPEN"CAS:ADDRESS" FOR INPUT AS #1
Направление: APPEND (добавление к уже существующему файлу)
Номер файла: 2
Можно открыть файл с последовательным доступом в режиме записи, исполь-
-зуя один номер файла, и в режиме чтения, используя другой. Однако, каждо-
+зуя один номер файла, и в режиме чтения, используя другой. Однако каждо-
му номеру файла будет при этом соответствовать с в о й б у ф е р, никак
не связанный с другими.
Если же Вы используете только один буфер, то для изменения режима до-
IX.3.2. О п е р а т о р ы PRINT# , PRINT#n,USING .
Ф у н к ц и и LOF() и LOC()
-
Да,- повторял он себе,- если бы на борту "Пи-
лигрима" я знал все, что должен знать настоя-
щий моряк, сколько несчастий можно было бы
избежать!
- Жюль Верн. Дети капитана Гранта
-
+ Ж.Верн. Дети капитана Гранта
Для формирования строк файла с последовательным доступом используются
операторы PRINT# и PRINT#USING.
+
Оператор PRINT# записывается в таком виде:
┌────────────────────────┐
│ {└─┘} │
ся буфер или закрывается файл.
Для экономного размещения данных на диске и избежания ошибок при их
считывании целесообразно список S в операторе PRINT# записывать в виде:
-
γ1;",";γ2;","; ...;",";γк{└─┘}
{ ; }
-
В этом случае значения в создаваемой строке располагаются в п л о т -
н о м формате и отделяются друг от друга запятыми.
Будем считать, что информация в одном операторе PRINT# составляет от-
логической строки соответствует переменная из списка S.
Так логическая строка, состоящая из трех полей - фасон одежды S$, цвет
одежды C$, цена одежды P - будет выведена в файл оператором
-
PRINT #1,S$;",";C$;",";P
▲ ▲ ▲
│ │ │
Переменные, определяющие поля данной логической строки
-
Если значение какого-либо строкового выражения γi содержит символы ","
и (или) ";", то в качестве разделителей можно использовать символ ";", за-
даваемый строковой функцией CHR$(34):
CHR$(34) γs CHR$(34)
-
П р и м е р 1 [7]. Запись данных в файл последовательного доступа.
─────────────────
10 OPEN "GAMES" FOR OUTPUT AS #1
30 INPUT"Введите название игры";F$:PRINT #1,F$
50 NEXT X
60 CLOSE #1
+
+
+
+
run
Введите название игры? Футбол
Введите название игры? Гольф
Введите название игры? Хоккей
Введите название игры? Регби
Ok
-
Если файл с именем "GAMES" уже существовал, то данная программа сотрет
его старое содержимое и будет писать туда заново.
Оператор PRINT# , не оканчивающийся символом "," или ";" автоматически
50 PRINT #1,R;",";I$;K$;I$
60 CLOSE #1
+
Оператор PRINT#,USING записывается в таком виде:
┌─────────────────────────┐
│ PRINT #n,USING T,S │ ,
40 FOR K=1 TO S:X=INT(RND(1)*3000)/99:PRINT #4,USING "###.##";X:NEXT K
50 CLOSE #4
- Однако, следует весьма осторожно употреблять префиксы, обозначающие де-
+ Однако следует весьма осторожно употреблять префиксы, обозначающие де-
нежные единицы ("$$","**" и "**$"), так как они вызывают форматирование
числовых величин как нечисловых. По этой причине числовые величины, снаб-
женные в дисковом файле такими префиксами, не могут быть считаны оттуда в
их исходном виде.
-
П р и м е р 8.
──────────────
10 OPEN "SAMPLE.DAT" FOR OUTPUT AS #1
информации, считанных в буфер или записанных на дискету.
+
+
+
IX.3.3. О п е р а т о р ы INPUT, LINE INPUT #n .
Ф у н к ц и и INPUT$ и EOF
Оператор LINEINPUT# , считывающий одиночное строковое значение, позво-
ляет решить "проблему запятой".
-
П р и м е р 1.
──────────────
10 OPEN "TEST.DAT" FOR OUTPUT AS #1
Хоккей
Регби
Ok
-
П р и м е р 4.
──────────────
10 OPEN "SAMPLE.DAT" FOR OUTPUT AS #1
run
Второе значение в файле: 567
Ok
-
П р и м е р 5.
──────────────
10 OPEN "TEST.DAT" FOR OUTPUT AS #1
Значение номер 1: Кремний 14 28.0855
Input past end in 50
Ok
-
При выполнении оператора PRINT# (строка 20) в файл записываются три
различных значения, но поскольку в операторе они разделяются символами
";", в файл они будут заноситься без разделителей. Когда оператор INPUT#
разделителей между отдельными значениями. Один из самых простых состоит в
том, чтобы присвоить значение "," строковой переменной и записывать ее по-
сле каждого значения в операторе PRINT# .
-
П р и м е р 6.
──────────────
10 OPEN "TEST.DAT" FOR OUTPUT AS #1
Отметим, что строковая величина в дисковом файле, могущая содержать за-
пятую, должна быть записана в кавычках; оператор INPUT# обеспечивает
устранение этих кавычек при считывании.
-
П р и м е р 7.
──────────────
10 OPEN "TEST.DAT" FOR OUTPUT AS #1
run
Первое значение в файле: Манагуа, Никарагуа
Ok
-
П р и м е р 8[7]. О б н о в л е н и е файла последовательного доступа.
─────────────────
10 OPEN "GAMES" FOR INPUT AS #1 'Открывается "старый" файл
80 CLOSE 1,2 'Оба файла закрываются
90 KILL"GAMES" 'Удаление исходного файла
100 NAME "GAMES2" AS "GAMES" 'Переименование "нового" файла
-
П р и м е р 9.
──────────────
10 CLEAR 1000:MAXFILES=5:DIM M(200)
┌─────────────────────┐
│ INPUT$(m[,[#]n]) │ ,
└─────────────────────┘
+
+
где: INPUT$ - служебное слово;
m - арифметическое выражение, целая часть значения которого должна
принадлежать отрезку [1,255];
│ Все символы, включая разделители, передаются в программу, за │
│ исключением специального символа с кодом ASCII &H1A , который │
│ воспринимается как признак конца файла и "прекращает выполне- │
- │ ние" функции │
+ │ ние" функции. │
└─────────────────────────────────────────────────────────────────┘
Функция INPUT$ предоставляет возможность последовательно выбирать сим-
волы из файла независимо от разделителей строк!
Для полного уяснения семантики функции INPUT$ рекомендуется "прогнать"
следующий пример при различных значениях параметров S и X.
-
П р и м е р 10[5].
──────────────────
10 CLEAR 1000:MAXFILES=5:DIM M(200)
120 IF Z=0 THEN 140
130 PRINT INPUT$(Z,#4)
140 CLOSE #4
-
Заметим, что "длину" файла не всегда можно определить заранее: предста-
вьте себе файл адресов, который все время приходится открывать в режиме
добавления данных (FOR APPEND). Функция EOF позволяет Вам решить эту проб-
сравнивает код очередного символа с кодом &h1А и возвращает:
-1 ("true"), если найден код конца файла, и
0 ("false") в противном случае.
-
П р и м е р 11. Продемонстрируем способ использования функции EOF().
───────────────
10 OPEN "TESTF" FOR INPUT AS #1
20 IF EOF(1) THEN 60
30 INPUT #1,A:PRINT A:GOTO 20
60 CLOSE #1
+
Ниже приведены 3 схемы, определяющие последовательность операций, кото-
рые должны быть выполнены при перемещениях строк файлов п о с л е д о в а-
т е л ь н о г о д о с т у п а из оперативной памяти на дискету и в об-
│ тически. │
│ D. Файл В закрывается. │
└───────────────────────────────────────────────────────────────────────┘
-
П р и м е р 12 [7].
───────────────────
10 OPEN "DRESS" FOR OUTPUT AS #1
Отдельные сегменты программных файлов - это специфические файлы данных
последовательного доступа. Поэтому программы или их фрагменты можно загру-
жать в память как данные. Ограничимся здесь лишь двумя примерами.
-
П р и м е р 13. Выполнение этой программы приводит к считыванию и вы-
─────────────── воду на экран всех строк программы "Симпсон".
10 'Чтение программного файла
30 LINE INPUT #1,R$:PRINT R$
50 IF NOT EOF(1) THEN 30
60 CLOSE #1
-
-
П р и м е р 14. Выполнение программы дает возможность "просмотреть" в
─────────────── той же самой программе "Симпсон" строки с номерами от
30 и до 70.
60 PRINT R$
80 IF NOT EOF(1) THEN 30
90 CLOSE #1
-
┌───────────────────────────────────────────────────────────────────────┐
│ 2. Общая схема пополнения файла В строками с его к о н ц а: │
│ А. В оперативной памяти резервируется буфер (оператором MAXFILES=).│
│ тически. │
│ D. Файл В закрывается. │
└───────────────────────────────────────────────────────────────────────┘
-
П р и м е р 15 [7]. Добавление в файл спортивной информации названия
──────────────────── двух новых видов спорта.
10 OPEN "GAMES" FOR APPEND AS#1
│ или LINEINPUT$, или INPUT$) │
│ D. Файл В закрывается │
└───────────────────────────────────────────────────────────────────────┘
-
П р и м е р 16 [7].
───────────────────
10 OPEN "DRESS" FOR INPUT AS#2
Ok
-
IX.3.4. П р и м е р ы
-
1. Гидрометцентр ведет статистику выпадения снега по регионам, для каж-
дого из которых заведен файл последовательного доступа.Во всех файлах име-
ется по три элемента данных: имя метеоролога, название региона, количест-
α) создайте файл последовательного доступа и заполните его именами
студентов, названиями академических курсов и оценками;при этом воспользуй-
тесь следующими данными:
+
+
+
┌──────────────┬────────────────────┬─────────┐
│ Имя студента │ Академический курс │ Отметка │
├──────────────┼────────────────────┼─────────┤
300 IF INPUT$(1)="Д" THEN END ELSE GOTO 220
-
IX.3.5. В ы в о д ф а й л о в д а н н ы х
на э к р а н и п р и н т е р
-
Текстовые экраны 0 и 1, графические экраны, а также принтер могут быть
объявлены устройствами вывода файлов последовательного доступа.
О т к р ы т и е таких файлов осуществляется оператором
1) 10 COLOR 1,11,7:SCREEN 2:OPEN "GRP:" FOR OUTPUT AS#1
30 PSET (69,80):PRINT #1,"Текст на графическом экране SCREEN 2"
50 GOTO 50
-
2) 10 COLOR 1,11,7:SCREEN 3:OPEN "GRP:" FOR OUTPUT AS#1
30 PSET (50,80):PRINT #1,"Текст на графическом экране SCREEN 3"
50 GOTO 50
-
3) Программа "777", записанная на диске в формате ASCII, выводится на
графический экран:
10 COLOR 1,15,8:SCREEN 3:PSET(0,10),15:MAXFILES=2
50 LINE INPUT #2,R$:PRINT #1,R$
80 IF NOT EOF(2) THEN 50
90 CLOSE:GOTO 90
-
4) Файл данных последовательного доступа,записанный на дискете под име-
нем "КАРП", выводится на принтер.
15 MAXFILES=2
18 OPEN "Карп" FOR OUTPUT AS#1:OPEN "LPT:" FOR OUTPUT AS#2
30 INPUT #1,M:PRINT #2,M;
35 IF NOT EOF(1) THEN 30
-
П р и м е р 5 [76]. Простейший г р а ф и ч е с к и й редактор.
────────────────── При формировании изображения Вам могут понадобить-
ся такие команды:
40 ' (подпрограмма)
60 PUT SPRITE 0,(16,P),1,H
70 PUT SPRITE 1,(22,P),1,T
+
80 PUT SPRITE 2,(28,P),1,U
90 PUT SPRITE 3,(16,P+8),1,H1
100 PUT SPRITE 4,(22,P+8),1,T1
+
+
+
IX.4. И с п о л ь з о в а н и е RAM - д и с к а
(т о л ь к о д л я к о м п ь ю т е р о в MSX-2)
-
RAMdisk (псевдодиск) - логическое устройство,
обеспечивающее хранение файлов в специально
выделенной области оперативной памяти.Исполь-
Англо-русский словарь по програм-
мированию и информатике
-
Свободное пространство памяти, размер которого можно определить при по-
мощи функций FRE(0) и FRE(""), автоматически распределяется интерпретато-
ром MSX-BASIC. Когда программа слишком длинна или использует слишком мно-
│ Помните, однако, что имя устройства МЕМ: обязано │
│ присутствовать всякий раз при упоминании имени файла! │
└───────────────────────────────────────────────────────┘
-
Приведем несколько примеров записи операторов для работы с RAM-диском:
MERGE"MEM:файл"
OPEN "MEM:файл" FOR INPUT AS#1 SAVE"MEM:файл"
OPEN "MEM:файл" FOR OUTPUT AS#6 LOAD"MEM:файл"
OPEN "MEM:файл" FOR APPEND AS#15 RUN"MEM:файл"
-
П р и м е р.
───────────
CALL MEMINI
- Ok
+ Ok
10 OPEN "MEM:GAMES" FOR OUTPUT AS#1
20 FOR X=1 TO 3
30 INPUT"Введите название игры";F$:PRINT #1,F$
└──────────────────────────────┘
возвращает позицию в файле, начиная с номера файла. Например, LOC вовраща-
ет 0 сразу после того, как файл открыт для ввода и вывода (OPEN FOR INPUT/
-OUTPUT) и возвращает длину файла cразу после того, как файл открыт для до-
+OUTPUT),и возвращает длину файла cразу после того, как файл открыт для до-
бавления (OPEN FOR APPEND).
┌────────────────────────────────┐
Функция │ LOF(Н о м е р ф а й л а) │
логично соответствующим конструкциям,используемым в версии MSX-Disk BASIC.
-
IX.5. Ф а й л ы на м а г н и т н о й л е н т е
-
Вывод программных файлов и файлов данных из оперативной памяти на маг-
нитную ленту и обратное считывание с ленты в память реализуется через
устройство, называемое м а г н и т о ф о н о м. Для идентификации файлам
ративной памяти на ленту.
6. CLOAD - команда чтения в оперативную память (или верификации) про-
грамм, записанных на ленте во внутреннем представлении.
+
7. BSAVE - команда записи во внутреннем представлении программных фай-
лов или файлов данных из конкретного участка оперативной памяти на ленту.
8. BLOAD - команда считывания в определенную область оперативной памя-
Приступим к краткому описанию синтаксиса и семантики упомянутых выше
средств организации файлов на магнитной ленте и работы с ними.
+
IX.5.1. Р а б о т а с п р о г р а м м н ы м и ф а й л а м и
В этом пункте описаны команды SAVE, LOAD, MERGE, RUN.
└───────────────────────┘
Эта команда, если в ней указаны имя устройства и имя программы,загружа-
ет и запускает на выполнение программу, сохраненную в формате ASCII. Она
-похожа на команду LOAD (с параметром R), за тем исключением,что она загру-
+похожа на команду LOAD (с параметром R) за тем исключением,что она загру-
жает программы только в формате ASCII и закрывает все открытые файлы.
В обоих случаях перед загрузкой программы автоматически выполняется ко-
манда NEW.
-
П р и м е р. Команда RUN"CAS:PROG1" загружает и запускает программу
─────────── с именем "PROG1",сохраненную на магнитной ленте командой
SAVE"CAS:PROG1"
└───────────────┘
подгружает в память первую встреченную на ленте в формате ASCII программу.
Обратите внимание на тот факт,что программы, вызываемые командой MERGE,
-имеют более высокий приоритет, по сравнению с программами, находящимися в
+имеют более высокий приоритет по сравнению с программами, находящимися в
памяти компьютера. Поэтому если в объединяемых программах имеются строки
с одинаковыми номерами, то строки программы в памяти компьютера будут за-
менены соответствующими строками "добавляемой" программы.
│ Команда CSAVE "сохраняет" программу во в н у т р е н н е м формате,│
│ т.е. в том виде, в каком она хранится в памяти компьютера. │
└───────────────────────────────────────────────────────────────────────┘
-
П р и м е р ы:
─────────────
α) команда CSAVE"PROG1" сохраняет файл, имя которого "PROG1", во внут-
рости, на которой программа была сохранена. Таким образом, Вам не нужно
повторно указывать скорость.
Если имя программы не указано в операторе,то будет загружена первая же
-программа, сохраненная во внутренем формате.
+программа, сохраненная во внутреннем формате.
Если Вы указываете имя программы,то следите за правильностью ввода име-
ни (т.е.,например, если Вы использовали прописные буквы при написании име-
ни, Вы должны ввести имя программы также прописными буквами).
чало данных, будет автоматически рассматриваться как адрес выполнения при
загрузке этих данных (эта часть информации полезна только в том случае,ес-
ли сохраняются подпрограммы на машинном языке).
-
П р и м е р ы. 1) BSAVE "CAS:ГОСТ",&HF000,&HF0EE
───────────── 2) BSAVE "CAS:" A,B,C
Команда BSAVE позволяет сохранить часть оперативной памяти на ленте
в оперативную память загружается файл, записанный на ленте во внутреннем
представлении под именем, равным значению выражения α.При наличии парамет-
ра R прочитанная программа автоматически запускается на счет.
-
П р и м е р ы. 1) BLOAD "CAS:DD"
───────────── 2) BLOAD "CAS:LEN", &H1500
3) BLOAD "CAS:TEST", R
Обратите внимание, что BLOAD может использоваться в программе, не вызы-
вая выполнения команды NEW или возврата в командный режим. Этот оператор
может использоваться также для загрузки частей программы на MSX-BASIC.
-
П р и м е р 1. Приведем программу, которая позволяет указать начальный
───────────── и конечный адреса загрузки двоичного файла.
1 INPUT"Имя файла";A$
91 IF Y$="д" OR Y$="Д" THEN LPRINT"Адрес запуска:";HEX$(A3);" или";A3
З а м е ч а н и е. Команды BSAVE и BLOAD можно применять и для работы
с произвольными дисковыми файлами (устройства A: и B:).
-
П р и м е р 2. Запись компьютерных игр с дискеты на магнитную ленту.
─────────────
1) Загрузите программу с дискеты в оперативную память командой
4. ...И "игрушка" запустится!
-
IX.5.2. Р а б о т а с ф а й л а м и д а н н ы х
-
Команда OPEN для устройства CAS: имеет следующий вид:
┌─────────────────────────────────┐
│ OPEN β FOR {INPUT } AS #n │
- │ {OUTPUT} │ ,
+ │ {OUTPUT} │ .
└─────────────────────────────────┘
Здесь β должно начинаться с символов "CAS:" и, кроме того, отсутствует
возможность, предоставляемая параметром APPEND для "наращивания" файлов.
Все остальное полностью аналогично работе с дисковыми файлами (устройства
A:, B: и MEM:).
-
П р и м е р. Строки 10÷30 создают файл данных на магнитной ленте. Для
─────────── его считывания в память требуется запустить этот фрагмент
со строки 50.
80 IF NOT EOF(1) THEN 70
90 END
-
-
- 9.6. Д о п о л н е н и е. Три очень п о л е з н ы х программы
-
-
+ IX.6. Д о п о л н е н и е.
+Три очень п о л е з н ы х программы:
1. Программа, осуществляющая посекторное копирование диска на кассету.
6 CLS:PRINT:PRINT"<<Посекторное копирование диска на кассету>>":PRINT:
PRINT
15 KEYON:POKE&H80CA,58'
16 END
+