Input from a File
To open a file for input, use the OPEN function with the keyword argument :DIRECTION set to :INPUT. To open a file for output, use the OPEN function with the keyword argument :DIRECTION set to :OUTPUT. The OPEN function takes a single required argument which is the name of the file to be opened. This name can be in the form of a string or a symbol. The OPEN function returns an object of type FILE-STREAM if it succeeds in opening the specified file. It returns the value NIL if it fails. In order to manipulate the file, it is necessary to save the value returned by the OPEN function. This is usually done by assigning it to a variable with the SETQ special form or by binding it using LET or LET*. Here is an example:
(setq fp (open "init.lsp" :direction :input))
Evaluating this expression will result in the file "init.lsp" being opened. The file object that will be returned by the OPEN function will be assigned to the variable "fp".
It is now possible to use the file for input. To read an expression from the file, just supply the value of the "fp" variable as the optional "stream" argument to READ.
Evaluating this expression will result in reading the first expression from the file "init.lsp". The expression will be returned as the result of the READ function. More expressions can be read from the file using further calls to the READ function. When there are no more expressions to read, the READ function will return NIL (or whatever value was supplied as the second argument to READ).
Once you are done reading from the file, you should close it. To close the file, use the following expression:
Evaluating this expression will cause the file to be closed.
Output to a File
Writing to a file is pretty much the same as reading from one. You need to open the file first. This time you should use the OPEN function to indicate that you will do output to the file. For example:
(setq fp (open "test.dat" :direction :output))
Evaluating this expression will open the file "test.dat" for output. If the file already exists, its current contents will be discarded. If it doesn't already exist, it will be created. In any case, a FILE-STREAM object will be returned by the OPEN function. This file object will be assigned to the "fp" variable.
It is now possible to write to this file by supplying the value of the "fp" variable as the optional "stream" parameter in the PRINT function.
(print "Hello there" fp)
Evaluating this expression will result in the string "Hello there" being written to the file "test.dat". More data can be written to the file using the same technique.
Once you are done writing to the file, you should close it. Closing an output file is just like closing an input file.
Evaluating this expression will close the output file and make it permanent.
A Slightly More Complicated File Example
This example shows how to open a file, read each Lisp expression from the file and print it. It demonstrates the use of files and the use of the optional "stream" argument to the READ function.
(do* ((fp (open "test.dat" :direction :input)) (ex (read fp) (read fp))) ((null ex) nil) (print ex))