Выбрать главу

(read-line [дескриптор_файла]). Функция считывает строку с клавиатуры или из файла. Ее действие аналогично предыдущему: каждый последующий вызов приводит к чтению очередной строки, что позволяет просмотреть весь файл.

(strcat строка1 [строка2] ...). Функция возвращает строку, представляющую собой сцепление строк строка1, строка2 и т.д.

Примеры:

(strcat “Auto” “CAD”) возвращает “AutoCAD”,

(strcat “fi” “le”) возвращает “file”.

(strlen [строка]) возвращает целое число, соответствующее числу символов в строке.

(strlen "file”) возвращает 4,

(strlen "file” “desk” “top”) возвращает 11,

(strlen) возвращает 0.

(substr строка начало [длина]). Функция возвращает подстроку строки, начинающуюся с позиции начало и захватывающую количество символов, соответствующее длине. Аргументы начало и длина должны быть целыми числами.

(substr “abcde” 2) возвращает “bcde”,

(substr “abcde” 2 1) возвращает “b”,

(substr “abcde” 3 2) возвращает “cd”.

Две функции - (write-char число [дескриптор_файла]) и (write-line строка [дескриптор файла]) - в примерах не нуждаются. Их задача - записывать в файл символы или строки.

7.4. Пример обработки файла

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

¬¬1¬¬¬¬0¬¬¬¬¬0.0000¬¬¬¬¬¬¬0.0000

¬¬2¬¬¬¬5¬¬¬¬¬6.4214¬¬¬¬¬¬¬8.2349

¬¬З¬¬¬10¬¬¬¬¬8.7965¬¬¬¬¬¬26.1500

и так далее. В четырех столбцах файла расположены следующие параметры: порядковый номер строки, значение аргумента (например, указан шаг счета нарастающим итогом), координаты X и Y расчетных точек, символом  ¬ обозначены обусловленные форматом вывода незаполненные позиции в строках данных.

Предположим далее, что численные значения координат могут содержать три знака перед десятичной точкой и включать в себя символ отрицательного числа - знак минус. Задача заключается в том, чтобы извлечь значения координат из файла и передать их Автокаду.

Длина строки файла составляет 32 позиции. В соответствии с оговоренным условием значения координат могут занимать 9 позиций. Для перестраховки установим длину читаемых позиций, равной 10 символам (вдруг в файле неожиданно для нас окажется число с четырехзначной целой частью).

С точки зрения составления программы, нам следует выполнить следующие операции: организовать цикл, внутри которого были бы прочитаны значения координат, и присвоить эти значения точкам будущего примитива. В этой связи следует упомянуть о существенном недостатке Автолиспа: в нем отсутствует понятие индексированной переменной, свойственное операторным языкам. Поэтому процесс вычерчивания примитива приходится производить параллельно с извлечением данных, а количество извлекаемых за один прием данных ограничивать (в рассматриваемом примере одной точкой).

Итак, напишем функцию, извлекающую из чертежа координаты точек.

1 (defun pnt ()

2 (setq lin (read-line file1))

3 (setq x1 (atof (substr lin 10 10)))

4 (setq y1 (atof (substr lin 23 10)))

5 (setq pt1 (listx1 y1))

)

Строка 1 устанавливает имя программируемой функции pnt, строка 2 считывает из файла, определенного дескриптором file1, первую строку lin, рассматривая ее как строковую переменную. Далее (строка 3) функция substr считывает информацию, содержащуюся в позициях 10...19 строки lin, функция atof преобразует считанную строковую переменную в числовую, а уже setq приписывает это значение координате x1. Аналогичные действия выполняет строка 4, устанавливая координату y1. Наконец, выделенные координаты приписываются точке pt1 (строка 5).