Файловый ввод/вывод
Файловый ввод/вывод
1 Тема доклада: Файловый ввод/вывод. Функциональный язык программирования Лисп поддерживает широкие возможности для работы с файлами. При этом вводится понятие потока, с которым связан файл с одной стороны и какой-то символ с другой. Поток представляет собой некий абстрактный объект, с которым мы можем работать, не углубляясь в аппаратную и программную реализацию работы с данными. Рассмотрим основные функции для работы с файлами: OPEN filespec &key direction element-type if-exists if-does-not-exist external-format Функция создает, открывает и возвращает поток файла заданного в filespec. filespec - путь к файлу direction - одно из:input, :output, :io, или :probe. По умолчанию:input. Режим открытия файла (чтение, запись, чтение/запись, поток создан но закрыт) element-type - тип данных с которыми поддерживает работу файл. По умолчанию Character. if-exists - поведение если файл уже существует (:error, :new-version, :rename, :rename-and-delete, :overwrite, :append, :supersede). if-does-not-exist - поведение если файл не существует (:error, :create). external-format - Внешний указатель формата файла. The default is :default. Возвращает поток (stream). (setq s (open “example.txt” :direction :io)); создает файл дле чтения/записи и связывает с ним символ s. LOAD filespec Эта функция загружает файл выражений и выполняет эти выражения. filespec - это строковая константа, которая представляет собой имя файла может включать префикс директории, например "/function/test1". Если операция успешно завершина, LOAD возвращает имя последней функции, определенной в файле. Если операция не выполнена, LOAD возвращает имя файла в виде строкового выражения. WRITE-BYTE byte stream Записывает байт в выходной поток. Тип данных должен быть изменен на unsigned-byte; _(with-open-file (s "temp-byte" :direction :output :element-type 'unsigned-byte)(write-byte 101 s)) => 101 ; в файле символ `е` WRITE-CHAR char stream Записывает символ в выходной поток; _(with-open-file (s "temp" :direction :output)(write-char #\B s)) р B WRITE-LINE string &optional stream &key start end Записывает строку (ключевые слова :start и :end позволяют задавать диапазон записываемой строки (отсчет с нуля)); производит перевод каретки на новую строку. _(with-open-file (s "temp" :direction :output )(write-line “Hello, world” s)) =>“Hello, world” WRITE-STRING string &optional stream &key start end Записывает строку но не добавляет новую линию в выходной поток; _(with-open-file (s "temp" :direction :output )(write-string “Hello, world” s :start 3 :end 6)) =>“lo,” READ-BYTE stream &optional eof-error-p eof-value Читает байт с входного потока. eof-error-p - по умолчанию nil. Oбобщенная булева переменная (nil - false , все остальное true). eof-value--признак конца файла. _(with-open-file (s "temp-bytes" :element-type 'unsigned-byte)(read-byte s)) =>101 READ-CHAR &optional stream eof-error-p eof-value recursive-p Читает символ с входного потока. Возвращает (целое) ASCII код считываемого символа. Если не задано <описателя файла> и в буфере ввода клавиатуры нет символов, READ-CHAR ждет, чтобы вы ввели что-либо с клавиатуры (заканчивающееся RETURN). Hапример, добустим, что буфер клавиатуры пуст: (read-char) будет ждать какого-либо ввода. Если вы набрали "АВС", завершив ввод RETURN, READ-CHAR возвратит 65 (код AS0CII буквы "А" (латинской)). Следующие три обращения к READ-CHAR возвратят 66,67 и 10 (переход на новую строку) соответственно. Если затем последует еще одно обращение к READ-CHAR, она будет ждать ввода; _(with-open-file (s "temp-bytes")(read-byte s)) =>#\e READ-LINE &optional stream eof-error-p eof-value recursive-p Читает строку. READ-LINE возвращает nil, иначе она возвращает строковое значение, которое было считано. Hапример, допустим, что F - это разрешенный указатель открытого файла: (read-line f) возвратит следующую введенную строку из файла или (если достигнут конец файла) nil. PEEK-CHAR &optional peek-type stream eof-error-p eof-value recursive-p Читает символ с потока так, что он доступен для следующей операции чтения. Аргумент peek-type позволяет перескочить к пробелу (Т) или какомуто отдельному символу(a character); /* ??? */ UNREAD-CHAR character &optional stream Помещает символ назад на переднюю сторону входного потока, где он остается пока не прочитается снова; LISTEN &optional stream Возвращает Т если данные доступны на входном потоке; READ-CHAR-NO-HANG &optional stream eof-error-p eof-value recursive-p Если символ доступен на входном потоке, функция возвращает символ, иначе nil; CLEAR-INPUT &optional stream Флеширует входной поток, если это нужно; FINISH-OUTPUT &optional stream Флеширует выходной поток и ждет результата от адресата; FORCE-OUTPUT &optional stream То же что и FINISH-OUTPUT но не ждет результата; CLEAR-OUTPUT &optional stream Очистка буфера потока; DELETE-FILE filespec Удаляет файл; _(with-open-file (s "delete-me.text" :direction :output :if-exists :error) (delete-file s)); создает и удаляет файл => T FILE-POSITION &optional stream Возвращает текущую позицию в файле связанным с потоком srteam; FILE-POSITION &optional stream position-spec Производит позиционирование в файле связанным с потоком srteam. и возвращает Т если позиционирование удалость и NIL при неудаче; (FILE-POSITION s 0) ; возврат к началу файла. CLOSE &optional stream Закрывает поток. Для работы с файлами можно использовать и функции PRINТ, PRINС, PRIN1 и READ. Приведем простенький пример: ; открываем поток для записи (setq out-stream (open "temp.txt" :direction :output)) (print 'abc out-stream) ;запись строки abc ABC (close out-stream) T ; открываем поток для чтения (setq in-stream (open "temp.txt" :direction :input)) #<INPUT-STREAM "temp.txt"> (read in-stream); считаем все с потока ABC (close in-stream) T
|