Удаление из файла - 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
, чтобы указать, что операция была выполнена успешно.
- Код открывает файл с помощью функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д