如何使用CL实现`tail`命令?

时间:2012-03-28 05:37:55

标签: common-lisp

“with-open-file”将从文件的开头读取。如果文件非常大,如何有效地读取最后20行?

此致!

1 个答案:

答案 0 :(得分:6)

这会打开一个文件,读取最后一个字节,然后关闭文件。

(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的{​​{3}}作为指南。