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

0

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

Для  объявления  прямого  доступа  к  файлу  в  операторе  OPEN  в  качестве  первого   параметра,

определяющего вид доступа (см. подразд. 8.4.8), указывается R. Например, оператор

10   OPEN "R", #2, "DAFL", 20

откроет для прямого доступа файл DAFL с длиной записи 20 байт (по умолчанию 128) и привяжет к нему логический номер 2.

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

Оператор OPEN определяет длину записи (четвертый параметр), а оператор FIELD определяет буфер для файла. Длина буфера не должна превышать длину записи; все эти длины исчисляются в байтах. Кроме того, оператор FIELD определяет строковые переменные с произвольно  выбираемыми именами и ассоциирует их с отдельными частями буфера. Эти переменные могут быть обычным образом использованы в операторах PRINT, строковых функциях и т. д., но непосредственное присваивание значений этим переменным не допускается. Иначе говоря, они  не могут быть указаны в операторе INPUT   и   в   левой   части   оператора   присваивания  LET.   Единственным  способом   занесения информации  в  эти  переменные  является  применение  операторов  LSET  и  RSET  (см.  рис.  8.8). Определение буфера посредством FIELD имеет вид

Программа на языке Бейсик Рис. 8.8. Работа с файлами прямого доступа в Бейсике Microsoft FIELD логический номер файла, длина поля AS строковая переменная,..

где последний параметр повторяется столько раз, сколько потребуется, например:

10   FIELD #1,20 AS Z$,10 AS NAME$

Приведенный выше оператор определяет буфер для файла с логическим номером 1, содержащий 30 байт, из которых первые 20 выделяются для строки Z$, а следующие 10 — для строки NAME$. Для чтения информации из такого файла первым делом надо считать требуемую запись в буфер, а затем использовать соответствующую переменную в программе. Например, оператор

50   GET #1,209

считает запись с номером 209 из файла с логическим номером 1 и поместит ее в буфер, а операторы

60   PRINT "ФАМИЛИЯ:"; NAMES 70   PRINT "ПОДРОБНОСТИ: "; Z$

Iиспользуют  значения  буферных  переменных,  определенных   оператором

FIELD.

Для записи данных в рассмотренный выше файл информация должна быть помещена в  буферные строковые  переменные,  после  чего  буфер  должен  быть  переписан  в  требуемую  запись  файла. Единственным средством помещения формации в буферные переменные являются операторы LSET и RSET, например.

75  LSETZ$="99-641" + "BSI644" 80   RSET NAME$ =B$

Оба оператора выполняют одни и те же действия, только LSET выравнивает по левому, a RSET — по правому краю поля.  Если при  этом  все  поле  оказалось заполненным, то  недостающие  позиции заполняются пробелами; если же данных в избытке, то лишние символы игнорируются. Как только данные попали в буфер, его надо переписать в требуемую запись файла, например:

90   PUT #1,304

Один оператор PUT или один оператор GET оперирует целым буфером.

Приведем перечень операторов, используемых для работы с файлом прямого доступа: OPEN "R", # 1,                 (открыть файл, указать длину записи)

FIELD # 1,                        (определить буфер)

LSET или RSET                (можно повторять много раз для записи данных

PUT#1,                            в файл)

GET #1,                            (можно повторять много раз для считывания данных из файла) CLOSE 1                           (прекращает связь между логическим номером и

файлом)

Файловая функция LOC(N) возвращает номер записи, использованный в PUT или GET, увеличенный на 1, что полезно при работе с файлом в последовательном режиме.

Числа можно преобразовать в строки и получать из строк с помощью двух Функций STR$(X)  и VAL(A$),  обсуждавшихся  в  гл.  4.  Однако  для  более  быстрого  преобразования  чисел  в  строки символов можно пользоваться следующими специальными функциями:

MKI$ (I%)    для целых значений, дает строку из двух байтов;

MKS$ (X)     для вещественных значений, дает строку из четырех байтов;

MKD$(A#)   для вещественных значений с двойной точностью, дает строку из восьми байтов.

Обратные  действия  выполняются  функциями  CVI(A$),  CVS(A$)  HCVD(A$).  Приведенная  ниже программа  иллюстрирует  применение  файлов  прямого  доступа  в  системе  учета   товаров.  Она упрощена в целях демонстрации существенных моментов при манипулировании  файлами. Пусть у лавочника на складе около 100 различных товаров, которые надо  регистрировать по следующей форме:

артикул, наименование, количество на складе, цена за штуку

Для простоты предполагается, что лавочник ввел свою систему артикулов в виде номеров от 1  до 100, что позволяет использовать артикул как номер записи в файле, в которую помещена остальная относящаяся к нему информация.

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

Подпрограмма модификации данных

Законченная программа имеет следующий вид:

10 REM ПРИМЕР МОДИФИКАЦИИ ИНВЕНТАРИЗАЦИОННОЙ ВЕДОМОСТИ

20 OPEN "FT , #1,"STOCK",26

30 FIELD#1.20 AS DES$.2 AS SN$,4 AS P$

40 A$=""

50 WHILE A$<>"K"

60        PRINT   "ВЫБЕРИТЕ:   МОДИФИКАЦИЯ.  ИЛИ   ПОИСК.   ИЛИ   КОНЕЦ

65        PRINT   "                             (М.   ИЛИ  П,   ИЛИ  К)"

70        INPUT  A*

80   IF А$="М" THEN GOSUB 190

90   IF А$="П" THEN GOSUB 130

100 WEND

110 CLOSE 1

120 STOP

130 REM ПОДПРОГРАММА ПОИСКА (ЧТЕНИЯ) ЗАПИСИ

140 PRINT "ВВЕДИТЕ АРТИКУЛ ТОВАРА";

150 INPUT PC%

160 GET#1 ,PC%

170 PRINT "ЗАПИСЬ ТАКОВА: ";DES$;CVIСSN$);CVS(P$)

180 RETURN

190 REM ПОДПРОГРАММА МОДИФИКАЦИИ ЗАПИСИ

200 GQSUB 130  :REM ЗАПРОС АРТИКУЛА И ИЗОБРАЖЕНИЕ ЗАПИСИ

210 PRINT "ДЛЯ ВНЕСЕНИЯ ИЗМЕНЕНИЙ В ОПИСАНИЕ ВВЕДИТЕ 1"

220 PRINT "                                                 3 КОЛИЧЕСТВО    2"

220 PRINT "                                                 В ЦЕНУ                    3"

230 INPUT С*

240 ON C% GOTO 250,290,330

250 PRINT "ВВЕДИТЕ НОВОЕ ОПИСАНИЕ (ДО 20 СИМВОЛОВ): ";

260 INPUT D$

270 LSET DES$=D$

280 GOTO 360

290 PRINT "ВВЕДИТЕ НОВОЕ КОЛИЧЕСТВО ТОВАРА: ";

300 INPUT S%

310 LSET SN%=MKI$(S%)

320 GOTO 360

330 PRINT "ВВЕДИТЕ НОВУЮ ЦЕНУ;

340 INPUT P

350   LSET P$ = MKS$(P)

360   PUT#1 , PC%

370 RETURN

380 END

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

По теме:

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