Язык программирования Форт


Глава 10. Хранение программ и данных - часть 27


Определите слово SAVEREC, которое будет заменять запись, помещая в нее число из стека. Предусмотрите уход из программы, если количество чисел в стеке меньше, чем значение переменной RECLEN.

Файлы строковых данных с последовательным доступом

В примере, который был очень подробно разобран в предыдущем разделе, мы имели дело с файлом числовых (двоичных) данных с последовательным доступом и с фиксированной длиной записи. Если вы вспомните, что еще раньше мы пользовались словом WORD для выделения строк из блока, то вам нетрудно будет представить, что мы можем работать также и с файлами, содержащими последовательности строк различной длины, отделенных друг от друга разделителями.

Мы рассмотрим здесь в общем виде строковые файлы в памяти, при этом вы определите в упражнениях некоторые полезные слова, а затем построим файл адресов и обсудим, как его можно использовать. Строковый файл (или файл строковых данных) можно описать в виде массива точно так же, как файл метеорологических данных. Предположим, что у вас имеется 10 блоков, содержащих имена и адреса людей. Можно создать массив, который описывает файл, следующим образом: CREATE ADDRESS 10 , 50 , 51 , 52 , 53 , 54 , 60 , 61 , 62 , 63 , 64 ,

Пользуясь этим массивом, можно инициализировать файл в памяти, применяя операцию GETFILE точно так же, как мы создавали в предыдущем разделе файл METFILE. т.е. чтобы сделать это, нужно написать ADDRESS GETFILE ADDFILE

Однако вместо того, чтобы описывать длину каждой записи в переменной, мы используем переменную для хранения байта-разделителя. Выберем сначала в качестве символа разделителя пробел, потому что это нам потребуется в упражнениях: VARIABLE DELIMITER 32 DELIMITER !

Теперь предположим, что нам нужно произвести разделение текста первых 64 символов в файле на строки. Мы можем определить для этого слово PARSELINE по аналогии с PARSIT из материала гл. 9: : PARSELINE ( адр -- ) (Разделить_строку) BLK @ >R >IN @ >R (Запоминает указатели при вводе из блока) TIB 80 0 FILL (Заполняет буфер ввода нулями) TIB 64 CMOVE (Вводит в буфер 64 символа) 0 BLK ! 0 >IN ! CR (Указывает на начало буфера ввода) BEGIN DELIMITER @ WORD (Начинает разделение) COUNT ?DUP WHILE TYPE SPACE (Выводит, если есть что) REPEAT (Повторяет) TIB 80 BLANK (Заполняет буфер ввода пробелами) R> >IN ! R> BLK @ ; (Восстанавливает указатели блока)




- Начало -  - Назад -  - Вперед -