«с открытым файлом» будет считываться с начала файла. Если файл ОЧЕНЬ большой, как эффективно читать последние 20 строк?Как реализовать команду `tail` с помощью CL?
С уважением!
«с открытым файлом» будет считываться с начала файла. Если файл ОЧЕНЬ большой, как эффективно читать последние 20 строк?Как реализовать команду `tail` с помощью CL?
С уважением!
Это открывает файл, читает последний байт и закрывает файл.
(defun read-final-byte (filename)
(with-open-file (s filename
:direction :input
:if-does-not-exist :error)
(let ((len (file-length s)))
(file-position s (1- len)) ; 0-based position.
(read-char s nil)))) ; don't error if reading the end of the file.
Если вы хотите конкретно прочесть последние n
линий, вам придется прочитать обратно неопределенное количество байт, пока вы не получите n+1
новой строки. Чтобы сделать это, вам нужно либо выполнить чтение блоков назад (быстрее, но закручиваться при чтении ненужных байтов), либо читать байты (медленнее, но допускает точность и немного более очевидный алгоритм).
Я подозреваю, что у tail
есть разумный алгоритм для этого, так что, вероятно, стоит прочитать tail
source для руководства.
см. Http://www.lispworks.com/documentation/lw51/CLHS/Body/f_file_p.htm –