首页 > 解决方案 > elisp 中是否有类似 fopen 的功能

问题描述

我知道insert-file-contents成语:

(defun read-lines (filePath)
  (with-temp-buffer
    (insert-file-contents filePath)
    (split-string (buffer-string) "\n" t)))

但是有没有更自然的方法来逐行读取文件而不一次读取整个文件?我正在寻找fopen/fread类似的功能。

标签: fileemacs

解决方案


我认为在 emacs 中处理文件的自然方式是将文件加载到缓冲区中,之后您可以逐行处理它。还可以查看emacs stackexchange 中的这个答案和ergoemacs的这篇博客文章

例如这样:

ELISP> (find-file "foo.txt")
#<buffer foo.txt>
ELISP> (goto-char 1)
1 (#o1, #x1, ?\C-a)
ELISP> (while (not (eobp))
  (print (current-line-contents))
  (forward-line 1))

示例 emacs 交互

为了不获取属性,可以使用函数 thing-at 点:

ELISP> (goto-char 1)
1 (#o1, #x1, ?\C-a)
ELISP> (while (not (eobp))
         (print (thing-at-point 'line t))
         (forward-line 1))

"line 1
"

"line 2
"

"line 3
"

"line 4
"

nil

如果您出于速度原因需要使用临时缓冲区,请尝试以下操作:

 (with-temp-buffer
         (insert-file-contents "./foo.txt")
         (while (not (eobp))
           (print (thing-at-point 'line t))
           (forward-line 1)))

推荐阅读