LISP:如何从文件中读取内容,并在另一个文件写?(LISP: How to read conten

2019-08-19 07:59发布

我想写出具有两个文件,并将从第一档到第二个内容作为参数名称的功能。

到目前为止,我写了一个函数,从文件中读取:

(defun readFile (name)
 (let ((in (open name)))
  (format t "~a~%" (read-line in))
   (close in)))

这将一个字符串写入到文件中的函数:

(defun writeFile (name content)
(with-open-file (stream name
    :direction :output
    :if-exists :overwrite
    :if-does-not-exist :create)
(format stream content)))

继Savantes说明我再次写的功能,这是它的外观:

(defun read-write-to-file (input-file output-file)
(WITH-OPEN-FILE (output-stream output-file
         :direction :output
         :if-exists :new-version
         :if-does-not-exist :create)
  (WITH-OPEN-FILE (input-stream input-file
                 :direction :input)
        (FORMAT output-stream "~a" (READ input-stream nil 'eof))
)))

现在唯一的问题是,它不读取整个文件。

Answer 1:

在Common Lisp的菜谱实际上包含了一个回答你的问题:

http://cl-cookbook.sourceforge.net/io.html

请参见“批量I / O”部分在页面底部。

稍作修改和修改,代码将是这样的:

(defun my-copy-file (from-file to-file)
  (with-open-file (input-stream from-file
                :direction :input
                :element-type '(unsigned-byte 8))
    (with-open-file (output-stream to-file
                   :direction :output
                   :if-exists :supersede
                   :if-does-not-exist :create
                   :element-type '(unsigned-byte 8))
      (let ((buf (make-array 4096 :element-type (stream-element-type input-stream))))
    (loop for pos = (read-sequence buf input-stream)
       while (plusp pos)
       do (write-sequence buf output-stream :end pos))))))

这应该能够处理文本文件和二进制文件。



Answer 2:

你发现with-open-file 。 使用它的输入和输出。 不要使用openclose来代替。

打开这两个文件,然后write给你什么样的输出流中read-line从输入流中。

WRITEFILE显然不能编译,顺便说一句。

另外,请使用正确的名称和缩进。

问题更新后编辑:

Read-line读取一行。 你可以把它写write-line ,让你的行结束被保留。 你需要做的是在一个循环,以复制更多的线路。

提示:你应该写你的名字在代码小写。 读者自动upcases他们。 我选择了写WRITEFILE以上,说明如何选定的名称在内部处理。 资本是不相关的。 Ll是相同的。 名的部分通常通过在Lisp代码连字符分开。



Answer 3:

可能是一个更简洁的解决方案,至少一样快以上,利用复制数据流导入流从优良UIOP包,包含在ASDF(并因此与Quicklisp):

(require 'uiop)
(defun file-copy (source destination)
  (with-open-file (in source :direction :input)
    (with-open-file (out destination :direction :output)
      (uiop:copy-stream-to-stream in out))))

它应该是一样快(如果不是更多),因为它使用WRITE-SEQUENCE为默认值。 见第一链接,更多的选择, copy-stream-to-stream



Answer 4:

该函数将在第一个文件的第二个内容:

(defun my-function (first second)
  (cl-fad:copy-file first second))

(当然,在CL-FAD包必须被加载)

彼得



Answer 5:

第一:不要使用“读”为目的,使用“READ-LINE”。 “读”执行读取宏,这将打开一个安全漏洞。 相反,你需要使用“WRITE-LINE”。

当您使用“READ-LINE”你应该看到,它正是这么做的:它读取只有一个行,并返回或(在你的情况下)的符号“EOF”时,有没有行改为向左。 它还提升您读指针下一个“EOL”后(或类似的东西,我不能很好地流的实现细节精通),所以当你做你的下一个“READ-LINE”在那个流上下一行被读取。 现在,您只需要反复读写,直到遇到文件的末尾。



文章来源: LISP: How to read content from a file and write it in another file?
标签: file io lisp