Удаление из файла - Lisp
Формулировка задачи:
Чтобы удалить строку из текстового файла. Есть способ, считывать последовательно из файла до целевой строки, и пропустить её. А результат записать в новый файл. Мне такой способ не нравится, так как размер файла может быть большим. Я ищу как можно удалить строку из исходного файла, быстрее. Может взять другой формат, не текстовый, напрмер .xls, или есть способ проще? А то смотрю библиотеку "buildnode", ничего не могу понять.
Решение задачи: «Удаление из файла»
textual
Листинг программы
;; Получить строку из файла (defun get-line (fil buf) (let ((stri "")) (loop (filGetBlo fil buf) (when (filEOF fil) (return stri)) (filSeek fil (- (filLoc fil) 1)) (let ((sym (blo2fix buf 1 1))) (cond ((= sym 13) nil) ((= sym 10) (return stri)) (t (setq stri (strCat stri (strChr sym))))))))) ;; Удалить строку с заданным номером (defun del-str (fname n) (let ((fil (gensym 'fil)) (buf (gensym 'buf)) (b (gensym 'b)) (pIn 0) (pOut 0)) (filOpen fil fname _BINARY_READ_WRITE) (bloCreate buf 2) (iter (for i from 1 to (- n 1)) (get-line fil buf)) (setq pOut (filLOC fil)) (get-line fil buf) (setq pIn (filLOC fil)) (loop (when (<= (- (filLOF fil) pIn) 2) (return t)) (filSeek fil pIn) (let* ((stri (get-line fil buf)) (l (strLen stri))) (bloCreate b (+ l 2)) (setq pIn (filLOC fil)) (filSeek fil pOut) (str2blo b stri 1) (fix2blo b 13 (+ l 1) 1) (fix2blo b 10 (+ l 2) 1) (filPutBlo fil b) (setq pOut (filLOC fil)) (bloDestroy b))) (filClose fil) (bloDestroy buf) 'OK))
Объяснение кода листинга программы
- Получение строки из файла
- Код открывает файл с помощью функции
filOpen
и передает имя файла и режим чтения/записи_BINARY_READ_WRITE
. - Создается буфер обмена с помощью функции
bloCreate
, которая принимает размер буфера в байтах. - Используя цикл
for
, код читает строки из файла с помощью функцииget-line
и сохраняет их в буфере обмена. - Функция
filLoc
используется для определения позиции текущей строки в файле. - Код проверяет, достигнут ли конец файла, и возвращает строку, если это так.
- Код использует функцию
filSeek
, чтобы вернуться к началу строки, и использует циклwhile
, чтобы обрабатывать строки в буфере обмена. - Код проверяет, является ли текущий символ символом новой строки, и если да, то возвращает строку.
- Код использует функцию
strCat
, чтобы объединить текущую строку с символом новой строки и строкой, прочитанной из файла. - Код использует функцию
strChr
, чтобы найти символ новой строки в текущей строке. - Код использует условный оператор
cond
, чтобы проверить, является ли текущий символ символом новой строки, и если да, то вернуть строку.
- Код открывает файл с помощью функции
- Удаление строки с заданным номером
- Код открывает файл с помощью функции
filOpen
и передает имя файла и режим чтения/записи_BINARY_READ_WRITE
. - Создается буфер обмена с помощью функции
bloCreate
, которая принимает размер буфера в байтах. - Используя цикл
for
, код читает строки из файла с помощью функцииget-line
и сохраняет их в буфере обмена. - Функция
filLoc
используется для определения позиции текущей строки в файле. - Код проверяет, достигнут ли конец файла, и возвращает строку, если это так.
- Код использует функцию
filSeek
, чтобы вернуться к началу строки, и использует циклwhile
, чтобы обрабатывать строки в буфере обмена. - Код проверяет, является ли текущая строка строкой, которую нужно удалить, и если да, то возвращает
nil
. - Код использует функцию
bloCreate
, чтобы создать новый буфер обмена, который будет использоваться для хранения строк, которые не должны быть удалены. - Код использует функцию
str2blo
, чтобы скопировать строки из старого буфера обмена в новый буфер обмена. - Код использует функцию
fix2blo
, чтобы добавить символы новой строки в новый буфер обмена. - Код использует функцию
filPutBlo
, чтобы записать новый буфер обмена обратно в файл. - Код использует функцию
bloDestroy
, чтобы освободить буферы обмена. - Код возвращает
OK
, чтобы указать, что операция была выполнена успешно.
- Код открывает файл с помощью функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д