Языки Бейсик
.pdfГлава X. Файлы данных |
91 |
Ввести ФИО преподавателя: Петров П.П. будете еще вводить(д н)? д Ввести число (дд): 21
Ввести день недели (нн): сp Ввести кол-во часов (чч): 6
Ввести ФИО преподавателя: Сидоров С.С. будете еще вводить(д н)? д Ввести число (дд): 22
Ввести день недели (нн): чт Ввести кол-во часов (чч): 15
Ввести ФИО преподавателя: Иванов И.И. будете еще вводить(д н)? н
10.14. Оператор GET
GET считывает из файла в буфер прямого доступа или в переменную.
Формат записи оператора GET:
GET [#]номер_файла%[,[номер_записи&][,переменная]]
ãäå
номер_файла% номер файла, указанного в операторе OPEN. номер_записи&для файлов прямого доступа — номер записи для чтения. Це-
лочисленное значение номера записи может находиться в диапазоне от 1 до 32 767. Под этим номером запись будет помещена в файл и в дальнейшем считана. Если номер записи опущен, то считывается запись, следующая за последней, прочитанной по оператору GET. Если же это первый оператор GET в программе, то читается запись с номером один Любая попытка при записи или чтении выйти за границы буфера вызывает сообщение об ошибке.
Для двоичных файлов — позиция байта, где начинается чтение или запись.
переменная переменная, в которую читается запись. Переменной обычно является переменная определенного пользователем типа данных.
В качестве примера приводятся опять же два фрагмента программы, которые читают файл, созданный в предыдущих примерах 10.13.1 и 10.13.2
Пример 10.14.1:
Считывание файла произвольного доступа с использованием буфера, созданного в примере 10.13.1
CLS
OPEN “FINAL.DAT” FOR RANDOM AS #1 'ОТКРЫВАЕМ ФАЙЛ ‘ПРЯМОГО 'ДОСТУПА 'создаем буфер
FIELD #1, 12 AS c$, 16 AS d$, 19 AS ct$, 20 AS f$ a1: INPUT “Введите номер записи”; nom%
GET #1, nom%
92 |
Языки Бейсик |
cl% = |
CVI(ct$) 'преобразование символа ct$ в число |
“Число:-”; c$ |
|
“день недели:-”; d$ |
|
“кол-во часов:-”; cl% |
|
“Преподаватель:-”; f$ |
|
“будете еще читать(д,н)?”; 'запрос на окончание |
|
da$ = |
INPUT$(1) 'снимаем один символ с клавиатуры |
da$ |
'проверка конца работы
IF UCASE$(da$) = “L” OR da$ = “Ä” OR da$ = “ä” GOTO a1 CLOSE
END
Пример 10.14.2:
Чтение файла прямого доступа с использованием переменной пользователя, созданного в примере 10.13.2
CLS
TYPE TestRecord 'Определяем переменную пользователя chislo AS STRING * 2 'так же, как и в программе, которая создавала
denned AS STRING * 2 'ýòîò ôàéë coltime AS INTEGER
fio AS STRING * 20
END TYPE
DIM uchet AS TestRecord 'определяем тип переменной
'открываем файл
OPEN “FINAL.DAT” FOR RANDOM AS #1 LEN = LEN(uchet)
a1: INPUT “Введите номер записи”; nom% 'запрашиваем номер записи
GET #1, nom%, uchet 'читаем эту запись
'Печатаем прочитанную запись
PRINT “Число:-”; uchet.chislo
PRINT “день недели:-”; uchet.denned
PRINT “кол-во часов:-”; uchet.coltime
PRINT “Преподаватель:-”; uchet.fio
PRINT “будете еще читать(д,н)?”; 'запрос на окончание da$ = INPUT$(1) 'снимаем один символ с клавиатуры
PRINT da$
'проверка конца работы
IF UCASE$(da$) = “L” OR da$ = “Ä” OR da$ = “ä” GOTO a1
CLOSE 'закрытие файла
Наблюдательный читатель может отметить, что в выражении, где проверяется конец работы программы, функция UCASE$ (преобразовать маленькие буквы в большие) применяется при сравнении с символом L, и не применяется с символом Д, на что существует такой ответ: в двух вариантах Бейсика, которые стояли на компьютере автора, функция UCASE$ с кириллицей не работала. В версии VISUAL BASIC 5.0, которой пользуется автор, таких проблем нет.
Результат выполнения программы.
Введите номер записи 1 Число: — 19
Глава X. Файлы данных |
93 |
день недели: — пн кол-во часов: — 13
Преподаватель: — Иванов И.И.
будете еще читать(д н)? д
Введите номер записи 2 Число: — 20
день недели: — вт
кол-во часов: — 11 Преподаватель: — Петров П.П. будете еще читать(д н)? д
Введите номер записи 3
Число: — 21
день недели: — сp
кол-во часов: — 6
Преподаватель: — Сидоров С.С. будете еще читать(д н)? н
Работая с файлом прямого доступа, необходимо иметь ввиду, что попытка прочитать несуществующую запись не приводит к ошибке, то есть заботы о подсчете количества записей в файле программист должен брать на себя. А чтобы дойти до конца файла, нужно файл читать как последовательный, проверяя, достигнут ли конец файла, как показано в примере 10.14.3. Только учтите, что вы получите на одну запись больше. Поэтому лучше самому в программе высчитывать число записей и следить, чтобы не прочитать лишнее, как показано в примере 10.14.4.
Пример 10.14.3:
Последовательное чтение файла прямого доступа
CLS
TYPE TestRecord 'Определяем переменную пользователя chislo AS STRING * 2 'так же, как и в программе, которая
создавала
denned AS STRING * 2 'ýòîò ôàéë coltime AS INTEGER
fio AS STRING * 20 END TYPE
DIM uchet AS TestRecord 'определяем тип переменной
'открываем файл
OPEN “FINAL.DAT” FOR RANDOM AS #1 LEN = LEN(uchet)
DO UNTIL EOF(1) 'организуем цикл до конца файла GET #1, , uchet 'читаем очередную запись 'Печатаем прочитанную запись
PRINT “Число:-”; uchet.chislo
PRINT “день недели:-”; uchet.denned PRINT “кол-во часов:-”; uchet.coltime PRINT “Преподаватель:-”; uchet.fio
PRINT “_____________________________________” LOOP 'конец цикла
CLOSE 'закрытие файла
Пример 10.14.4:
94 Языки Бейсик
Чтение файла прямого доступа
CLS
TYPE TestRecord 'Определяем переменную пользователя chislo AS STRING * 2 'так же, как и в программе, которая создавала
denned AS STRING * 2 'ýòîò ôàéë coltime AS INTEGER
fio AS STRING * 20 END TYPE
DIM uchet AS TestRecord 'определяем тип переменной 'открываем файл
OPEN “FINAL1.DAT” FOR RANDOM AS #1 LEN = LEN(uchet)
PRINT “длина файла=“; LOF(1)
PRINT “длина записи=“; LEN(uchet)
PRINT “число записей=“; LOF(1) / LEN(uchet)
chzap% = LOF(1) / LEN(uchet) 'Высчитываем число записей
a1: INPUT “Введите номер записи”; nom% 'запрашиваем номер записи IF nom%>chzap% THEN PRINT “Запись не существует”: GO TO a1
GET #1, nom%, uchet 'читаем запрошенную запись 'Печатаем прочитанную запись
PRINT “Число:-”; uchet.chislo
PRINT “день недели:-”; uchet.denned PRINT “кол-во часов:-”; uchet.coltime PRINT “Преподаватель:-”; uchet.fio
PRINT “_____________________________________”
PRINT “будете еще читать(д,н)?”; 'запрос на окончание da$ = INPUT$(1)
PRINT da$
'проверка конца работы
IF UCASE$(da$) = “L” OR da$ = “Д” OR da$ = “д” GOTO a1 CLOSE 'закрытие файла
Необходимость создания файлов прямого доступа возникает тогда, когда последовательная обработка файла и недостаточные ресурсы оперативной памяти приводят к тому, что время обработки файла становится значительным для пользователя, что происходит все реже и реже в связи с увеличением производительности компьютеров. В силу этого задача ускорения обработки данных из чисто прикладной задачи, которую приходилось решать и автору, все больше становится системной (решается на уровне написания систем программирования) или даже технической (увеличивается производительность “железа”).
10.15. Функция LOC
Функция LOC(LOCation-определение позиции) позволяет получить сведения о количестве записей последовательного и произвольного файлов, считанных с диска, начиная с момента его открытия.
Формат записи функции:
LOC(номер_файла%)
Глава X. Файлы данных |
95 |
ãäå
номер_файла% номер открытого файла или устройства. Для бинарных файлов LOC возвращает позицию последнего считанного или записанного байта. Для файлов прямого доступа LOC возвращает номер последней записи, считанной или записанной в файл. Для последовательных файлов LOC возвращает позицию текущего байта в этом файле, деленную на 128.
Пример :
OPEN “TEST.DAT” FOR RANDOM AS #1 'Открытие файла прямого ‘доступа
FOR i% = 1 TO 10
PUT #1, , i% 'запись в файл прямого доступа NEXT i%
SEEK #1, 2 'встать на вторую запись
GET #1, , i% 'прочитать запись в i%
PRINT “Данные: “; i%; “ Текущая запись: “; LOC(1); “ Следующая:
“; SEEK(1)
10.16. Функция LOF
Функция LOF(Length Of File-длина файла) возвращает длину файла в байтах.
Формат записи функции:
LOF(номер_файла%)
ãäå
номер_файла% — Номер файла, открытого оператором OPEN.
Пример :
INPUT “Введите имя файла: “; f$
OPEN f$ FOR BINARY AS #1
PRINT “Длина файла = “; LOF(1)
CLOSE
10.17. Функция EOF
Функция EOF(End Of File-конец файла) проверяет, достигнут или нет при чтении файла признак конца файла. EOF возвращает “истинно” (не ноль) при достижении конца файла.
Формат записи функции:
EOF(номер_файла%)
ãäå
номер_файла% — Номер файла, открытого оператором OPEN.
Пример :
CLS
96 |
Языки Бейсик |
OPEN “ÒÅÑÒ.ÄÀÍ” FOR OUTPUT AS #1 |
|
FOR i% = 1 TO 10 |
|
WRITE #1, i%, 2 * i%, 5 * i% |
|
NEXT i% |
|
CLOSE #1 |
|
OPEN “ÒÅÑÒ.ÄÀÍ” FOR INPUT AS #1 |
|
DO |
|
LINE INPUT #1, a$ |
|
PRINT a$ |
|
LOOP UNTIL (EOF(1)) |
|
10.18. Функции CVS, CVI, CVD, CVL
MKI$, MKL$, MKS$ и MKD$ переводят числа в числовые строки, которые могут храниться в операторе строковых переменных FIELD.(СМ.10.11.)
CVI(ConVert to Integer-преобразовать к целому числу), CVL(ConVert to Long Integer-преобразовать к длинному целому числу), CVS(ConVert to Single-пре- образовать к обычной точности), и CVD(ConVert to Double-преобразовать к двойной точности), переводят эти строки обратно в числа из строковых переменных оператора FIELD.
Формат записи функций CVI, CVL, CVS, CVD.
CVI(2_байт_числ_строка)
CVL(4_байт_числ_строка)
CVS(4_байт_числ_строка)
CVD(8_байт_числ_строка)
После выполнения этих функций над числами можно осуществлять арифмети- ческие операции. Пример записи функции CVI:
Clokc% = CVI(coltime$)
Функция |
Возвращает |
Функция |
Возвращает |
|
|
|
|
MKI$ |
2 байт. строку |
CVI |
Целое |
|
|
|
|
MKL$ |
4 байт. строку |
CVL |
Длинное целое |
|
|
|
|
MKS$ |
4 байт. строку |
CVS |
Число одинарной точности |
|
|
|
|
MKD$ |
8 байт. строку |
CVD |
Число двойной точности |
|
|
|
|
|
|
|
|
10.19. Функция SEEK. Оператор SEEK
Функция SEEK возвращает текущую позицию файла.
Оператор SEEK устанавливает позицию файла для следующей записи или чтения.
Формат записи функции SEEK:
SEEK(номер_файла%)
Формат записи оператора SEEK:
Глава X. Файлы данных |
97 |
|
SEEK [#]номер_файла%, позиция& |
|
|
ãäå |
|
|
номер_файла% номер файла, открытого оператором OPEN. |
|
|
позиция |
позиция, в которой будет осуществляться следующее чтение |
|
|
или запись. Для файлов прямого доступа, номер записи. Для |
|
|
других файлов, позиция байта по отношению к началу файла. |
|
|
Первый байт находится в позиции 1. |
|
Пример :
OPEN “TEST.DAT” FOR RANDOM AS #1 FOR i% = 1 TO 10
PUT #1, , i%
NEXT i% SEEK #1, 2
GET #1, , i%
PRINT “Данные: “; i%; “ Текущая запись: “; LOC(1); “ Следующая:
“; SEEK(1)
10.20. Оператор FILEATTR
Оператор FILEATTR возвращает информацию об открытом файле.
Формат записи оператор FILEATTR:
FILEATTR(номер_файла%,атрибут%)
ãäå
номер_файла% номер файла, открытого оператор OPEN.
атрибут% |
указывает тип возвращаемой информации. Если атрибут% ра- |
|||
|
вен 1, FILEATTR возвращает значение, указывающее режим |
|||
|
доступа к файлу: |
|
|
|
|
|
|
|
|
|
|
Значе- |
Режим |
|
|
|
íèå |
|
|
|
|
|
|
|
|
|
1 |
Ââîä |
|
|
|
|
|
|
|
|
2 |
Вывод |
|
|
|
|
|
|
|
|
4 |
Прямой |
|
|
|
|
|
|
|
|
8 |
Добавле- |
|
|
|
íèå |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
Двоичный |
|
|
|
|
|
|
|
|
|
|
|
Если атрибут% равен 2, FILEATTR возвращает указатель файла DOS.
Пример :
OPEN “ÒÅÑÒ.ÄÀÍ” FOR BINARY AS #1
PRINT FILEATTR(1, 1)
CLOSE
98 |
Языки Бейсик |
10.21. Оператор FREEFILE
Оператор FREEFILE возвращает номер следующего доступного неиспользуемого файла, который можно использовать в операторе OPEN.
Формат записи оператора FREEFILE:
FREEFILE
Пример :
OPEN “ÒÅÑÒ.ÄÀÒ” FOR OUTPUT AS #1
PRINT “Номер следующего файла: “; FREEFILE
CLOSE
10.22. Оператор LOCK, UNLOCK
Оператор LOCK ограничивает или закрывает доступ к файлу при работе в сети.
Оператор UNLOCK отменяет ограничения, наложенные последним оператором LOCK.
Формат записи операторов:
LOCK [#]номер_файла% [,{запись& | [начало&] TO конец&}]
UNLOCK [#]номер_файла% [,{запись& | [начало&] TO конец&}]
ãäå |
|
номер_файла% |
Номер открытого файла. |
запись& |
Для файлов прямого доступа — номер закрываемой за- |
|
писи по отношению к первой записи в файле. Для бинар- |
|
ных файлов — номер закрываемого байта относительно |
|
первого байта в файле. |
начало& и конец& номера первой и последней записи или байта в диапазоне закрываемых или открываемых записей или байтов.
Для последовательных файлов LOCK и UNLOCK влияют на весь файл.
Пример :
'Этот пример работает только в сети. OPEN “TEST.DAT” FOR RANDOM AS #1
FOR i% = 1 TO 10
PUT #1, , i%
NEXT i%
LOCK #1, 2 'Закрытие записи 2
GET #1, 2, i%
UNLOCK #1, 2 'Открытие записи 2
Глава XI. Справочно |
99 |
Глава XI. Справочно
11.1. **СИНТАКСИС**
КЛЮЧЕВЫЕ СЛОВА Темы, которые приведены заглавными буквами, являются основными ключевыми словами. Они представляют собой необходимую часть синтаксиса выражений, если они не заключены в скобки.
метки-заполнители Темы, которые приведены с использованием клавиш нижнего регистра, Вы должны использовать в выражении (например, имя файла $). Синтаксис Basic использует суффиксы типов данных для меток-заполните- лей, которые должны быть специфицированы. Метки — заполнители, которые имеют более одного типа данных, не имеют суффиксов типов данных.
[необязательные темы] Темы, заключенные в квадратные скобки, необязательны.
{выбор1 | выбор2} Фигурные скобки и вертикальная черта означают, что Вы можете сделать выбор между двумя или более темами. Вы должны использовать одну из тем в выражении, если фигурные скобки не заключены в квадратные.
òåìà, òåìà, … Многоточие означает, что большое количество предшествующих тем может быть использовано в выражении в одной строке.
Первое ключевое слово
. Вертикальное многоточие из трех точек используется для описания
. выражений в несколько строк (или блочно-структурированных
. выражений). Это значит, что другие выражения могут быть
. использованы между началом и концом блока.
Последнее ключевое слово
11.2. **НАБОР ОСНОВНЫХ СИМВОЛОВ**
Набор основных символов Basic включает буквенные символы (A-Z, a-z), числовые символы (0-9 и A-F или a-f для шестнадцатиричных чисел) и специальные символы. Некоторые символы в Basic имеют специальное назначение:
|
Суффиксы типов данных |
|
|
|
|
|
|
|
! Обычная точность |
% Целое |
|
|
# Двойная точность |
& Длинное целое |
|
|
$ Строка символов |
@ Денежные едини- |
|
|
öû |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Специальные символы и математические операторы |
|||
|
|
||
Математические операторы |
Специальные символы |
||
|
|
||
* Знак умножения |
‘ Символ комментария (апостроф) |
||
|
|
|
|
|
|
|
|
100 |
|
|
|
Языки Бейсик |
|
|
|
|
|
|
|
Математические операторы |
|
Специальные символы |
|||
|
|
|
|||
- Знак вычитания |
; Управляющий символ для операторов |
||||
|
PRINT è INPUT |
|
|
||
|
|
|
|
||
|
|
|
|||
/ Знак деления (слеш) |
, Управляющий символ для операторов |
||||
|
PRINT è INPUT |
|
|
||
|
|
|
|
||
= Знак равенства |
: Разделитель нескольких операторов |
||||
программы в одной строке |
|
||||
|
|
||||
|
|
|
|||
|
_ Символ подчеркивания (сохраняется |
||||
> Знак больше чем |
|
для совместимости с другими версиями |
|||
|
|
BASIC, не поддерживается QBASIC) |
|||
+ Знак сложения |
? Приглашение при операторе INPUT |
||||
|
|
|
|
|
|
. Десятичная точка |
|
|
|
|
|
|
|
|
|
|
|
< Знак меньше чем |
|
|
|
|
|
|
|
|
|
|
|
\ Знак целочисленного деления |
|
|
|
|
|
(обратный слэш) |
|
|
|
|
|
|
|
|
|
|
|
^ Знак возведения в степень |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11.3. **КЛЮЧЕВЫЕ СЛОВА БЕЙСИКА** |
|
|
|
||
|
|
|
|
|
|
Программный раздел |
|
|
Ключевые слова |
|
|
|
|
|
|
|
|
|
|
DO…LOOP, |
END, |
EXIT, |
|
|
|
FOR…NEXT, |
IF…THEN…ELSE, |
||
Управляющие элементы программ |
|
GOSUB…RETURN, |
GOTO, |
||
|
|
ON…GOSUB, ON…GOTO, SELECT |
|||
|
|
CASE, STOP, SYSTEM |
|
||
|
|
|
|||
|
|
CONST, DATA, DIM, ERASE, OPTI- |
|||
Описание констант и переменных |
|
ON BASE, READ, REM, RESTORE, |
|||
|
|
SWAP, TYPE…END TYPE |
|
||
|
|
|
|||
|
|
CALL, DECLARE, EXIT, FUNCTI- |
|||
Определение и вызов процедур |
|
ON, RUN, SHELL, SHARED, STA- |
|||
|
|
TIC, SUB |
|
|
|
|
|
CLS, CSRLIN, INKEY$, INP, IN- |
|||
|
|
PUT, KEY(присваивание), LINE IN- |
|||
|
|
PUT, LOCATE, |
LPOS, LPRINT, |
||
Ввод/Вывод |
|
LPRIN, USING, OPEN, COM, OUT, |
|||
|
|
POS, PRINT, PRINT USING, SPC, |
|||
|
|
функция |
SCREEN, TAB, |
VIEW |
|
|
|
PRINT, WAIT, WIDTH |
|
||
|
|
CIRCLE, COLOR, GET(графика), LI- |
|||
|
|
NE, PAINT, PALETTE, |
PCOPY, |
||
Вывод графических изображений |
|
PMAP, |
POINT, |
PRESET, |
PSET, |
|
|
PUT(графика), оператор SCREEN, |
|||
|
|
VIEW, WINDOW, |
|
||
|
|
|
|||
Команды системного файла |
|
DOS CHDIR, KILL, MKDIR, NA- |
|||
|
ME, RMDIR |
|
|
||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
