Тема доповіді: Файловий введення / висновок.
Функціональна мова програмування Лісп підтримує широкі можливості для роботи з файлами. При цьому вводиться поняття потоку, з яким пов'язаний файл з одного боку і якийсь символ з іншого. Потік являє собою якийсь абстрактний об'єкт, з яким ми можемо працювати, не заглиблюючись в апаратну і програмну реалізацію роботи з даними.
Розглянемо основні функції для роботи з файлами:
Функція створює, відкриває і повертає потік файлу заданого в 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).
Ця функція завантажує файл виразів і виконує ці вирази. filespec - це строкова константа, яка представляє собою ім'я файлу може включати префікс директорії, наприклад "/ function/test1". Якщо операція успішно завершіна, LOAD повертає ім'я останньої функції, визначеної у файлі. Якщо операція не виконана, LOAD повертає ім'я файлу у вигляді строкового вираження.
Записує байт у вихідний потік. Тип даних повинен бути змінений на unsigned-byte;
Записує символ у вихідний потік;
Записує рядок (ключові слова: start і: end дозволяють задавати діапазон записуваної рядка (відлік з нуля)); робить переклад каретки на новий рядок.
_ (With-open-file (s "temp": direction: output) (write-line "Hello, world" s))
=> "Hello, world"
Записує рядок але не додає нову лінію у вихідний потік;
_ (With-open-file (s "temp": direction: output) (write-string "Hello, world" s: start 3: end 6))
=> "Lo,"
Читає байт з вхідного потоку.
eof-error-p - за замовчуванням nil. Oбобщенная булева змінна (nil - false, все інше true).
eof-value-ознака кінця файлу.
Читає символ з вхідного потоку. Повертає (ціле) ASCII код зчитується, символу. Якщо не задано <описувача файлу> і в буфері введення клавіатури немає символів, READ-CHAR чекає, щоб ви ввели що-небудь з клавіатури (закінчується RETURN). Hаприклад, добустім, що буфер клавіатури порожній:
(Read-char)
буде чекати будь-якого введення. Якщо ви набрали "АВС", завершивши введення RETURN, READ-CHAR поверне 65 (код AS0CII літери "А" (латинської)). Наступні три звернення до READ-CHAR повернуть 66,67 і 10 (перехід на новий рядок) відповідно. Якщо потім піде ще одне звернення до READ-CHAR, вона буде чекати введення;
Читає рядок. READ-LINE повертає nil, інакше вона повертає строкове значення, яке було лічено. Hаприклад, припустимо, що F - це дозволений покажчик відкритого файлу:
(Read-line f)
поверне наступну введений рядок з файлу або (якщо досягнуто кінець файлу) nil.
Читає символ з потоку так, що він доступний для наступної операції читання. Аргумент peek-type дозволяє перескочити до пробілу (Т) або какомуто окремому символу (a character) / *? * /
Поміщає символ тому на передню сторону вхідного потоку, де він залишається поки не прочитається знову;
Повертає Т якщо дані доступні на вхідному потоці;
Якщо символ доступний на вхідному потоці, функція повертає символ, інакше nil;
Флешірует вхідний потік, якщо це потрібно;
Флешірует вихідний потік і чекає результату від адресата;
Те ж що і
Очищення буфера потоку;
Видаляє файл;
_ (With-open-file (s "delete-me.text": direction: output: if-exists: error) (delete-file s)); створює і видаляє файл
=> T
Повертає поточну позицію у файлі пов'язаним з потоком srteam;
Виробляє позиціонування у файлі пов'язаним з потоком srteam.
і повертає Т якщо позиціонування відважність і NIL при невдачі;
(FILE-POSITION s 0); повернення до початку файлу.
Закриває потік.
Для роботи з файлами можна використовувати і функції PRINТ, PRINС, PRIN1 і READ. Наведемо простенький приклад:
Функціональна мова програмування Лісп підтримує широкі можливості для роботи з файлами. При цьому вводиться поняття потоку, з яким пов'язаний файл з одного боку і якийсь символ з іншого. Потік являє собою якийсь абстрактний об'єкт, з яким ми можемо працювати, не заглиблюючись в апаратну і програмну реалізацію роботи з даними.
Розглянемо основні функції для роботи з файлами:
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