Тема доклада: Файловый ввод/вывод.
Функциональный язык программирования Лисп поддерживает широкие возможности для работы с файлами. При этом вводится понятие потока, с которым связан файл с одной стороны и какой-то символ с другой. Поток представляет собой некий абстрактный объект, с которым мы можем работать, не углубляясь в аппаратную и программную реализацию работы с данными.
Рассмотрим основные функции для работы с файлами:
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
Похожие работы
... языка Си, поддерживающие обмен данными с файлами на уровне потока, позволяют обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизованный ввод и вывод. Таким образом, поток - это файл вместе с предоставляемыми средствами буферизации. При работе с потоком можно производить следующие действия: · открывать и закрывать потоки (связывать указатели на потоки с ...
... спутниками 2. Спутники задевают верхние слои атмосферы, постепенно снижаются, затем падают на Землю. Живут один-два года. Зато такие спутники дешевые и легкие. Подсистемы ввода/вывода Файловые устройства Цель любой программы – обработка данных, т.е. надо грамотно построить структуры данных и написать алгоритмы их обработки. Структуры данных, которыми оперирует язык: ...
... ('Поиск путей длины ', PathLen, ' ...'); case TryMove (x, y) of true: WriteLn ('Нашел путь :-)'); false: WriteLn ('Нет путей :-('); end; end; End. Файловый тип. Ввод/вывод. Все рассмотренные ранее типы данных обладали одним общим свойством - число их компонентов конечно и заранее фиксировано. Однако, существует достаточно широкий класс задач, когда количество компонент данных ...
... требует, чтобы вызывающий операцию монтирования пользователь был привилегированным, хотя большинству пользователей навязываются эти требования. (Например, ULTRIX компании Digital позволяет любому пользователю монтировать файловую систему NFS до тех пор, пока этот пользователь имеет права доступа по записи в каталог точки монтирования. Пользователь может монтировать ту же самую файловую систему к ...
0 комментариев