Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Языки Бейсик

.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
622 Кб
Скачать

Глава 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$ в число

PRINT

“Число:-”; c$

PRINT

“день недели:-”; d$

PRINT

“кол-во часов:-”; cl%

PRINT

“Преподаватель:-”; f$

PRINT

“будете еще читать(д,н)?”; 'запрос на окончание

da$ =

INPUT$(1) 'снимаем один символ с клавиатуры

PRINT

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]