输入流在对象内结束

输入流在对象内结束

我想计算平面文件中的行数,所以我编写了代码:

(defun ff-rows (dir file)
  (with-open-file (str (make-pathname :name file
                                      :directory dir)
                                      :direction :input)
    (let ((rownum 0))
      (do ((line (read-line str file nil 'eof)
                 (read-line str file nil 'eof)))
          ((eql line 'eof) rownum)
        (incf rownum )))))

但是我得到了错误:
*** - READ: input stream
       #<INPUT BUFFERED FILE-STREAM CHARACTER #P"/home/lambda/Documents/flatfile"
         @4>
      ends within an object

我能问一下这里有什么问题吗我试着数了数行,这次手术很好。
注意:下面是我用来测试函数的平面文件的内容:
2 3 4 6 2
1 2 3 1 2
2 3 4 1 6

最佳答案

再短一点。

(defun ff-rows (dir file)
  (with-open-file (stream (make-pathname :name file
                                         :directory dir)
                          :direction :input)
    (loop for line = (read-line stream nil nil)
          while line count line)))

注意,您需要获得READ-LINE的参数首先是小溪文件不是参数列表的一部分。
通常,将路径名处理混合到一般的Lisp函数中也不是一个好主意。
(defun ff-rows (pathname)
  (with-open-file (stream pathname :direction :input)
    (loop for line = (read-line stream nil nil)
          while line count line)))

在其他函数或其他代码中执行路径名处理将路径名组件传递给函数通常是错误的设计传递完整的路径名。
使用LispWorks文件选择器:
CL-USER 2 > (ff-rows (capi:prompt-for-file "some file"))
27955

更好的情况是,所有基本I/O函数都在流上工作,而不是在路径名上工作因此,您可以计算网络流、串行流或其他流中的行数。

关于input - 输入流在对象内结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13396083/

10-11 15:13