Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Input stream ends within an object

I want to count the number of rows in a flat file, and so I wrote the code:

(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 )))))

However I get the error:

*** - READ: input stream
       #<INPUT BUFFERED FILE-STREAM CHARACTER #P"/home/lambda/Documents/flatfile"
         @4>
      ends within an object

May I ask what the problem is here? I tried counting the rows; this operation is fine.

Note: Here is contents of the flat file that I used to test the function:

2 3 4 6 2 
1 2 3 1 2
2 3 4 1 6
like image 606
category Avatar asked Jun 24 '26 03:06

category


1 Answers

A bit shorter.

(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)))

Note that you need to get the arguments for READ-LINE right. First is the stream. A file is not part of the parameter list.

Also generally is not a good idea to mix pathname handling into general Lisp functions.

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

Do the pathname handling in another function or some other code. Passing pathname components to functions is usually a wrong design. Pass complete pathnames.

Using a LispWorks file selector:

CL-USER 2 > (ff-rows (capi:prompt-for-file "some file"))
27955

Even better is when all the basic I/O functions work on streams, and not pathnames. Thus you you could count lines in a network stream, a serial line or some other stream.

like image 199
Rainer Joswig Avatar answered Jun 27 '26 09:06

Rainer Joswig