我想写出具有两个文件,并将从第一档到第二个内容作为参数名称的功能。
到目前为止,我写了一个函数,从文件中读取:
(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))
)))
现在唯一的问题是,它不读取整个文件。
在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))))))
这应该能够处理文本文件和二进制文件。
你发现with-open-file
。 使用它的输入和输出。 不要使用open
和close
来代替。
打开这两个文件,然后write
给你什么样的输出流中read-line
从输入流中。
您WRITEFILE
显然不能编译,顺便说一句。
另外,请使用正确的名称和缩进。
问题更新后编辑:
Read-line
读取一行。 你可以把它写write-line
,让你的行结束被保留。 你需要做的是在一个循环,以复制更多的线路。
提示:你应该写你的名字在代码小写。 读者自动upcases他们。 我选择了写WRITEFILE
以上,说明如何选定的名称在内部处理。 资本是不相关的。 L
和l
是相同的。 名的部分通常通过在Lisp代码连字符分开。
可能是一个更简洁的解决方案,至少一样快以上,利用复制数据流导入流从优良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
。
该函数将在第一个文件的第二个内容:
(defun my-function (first second)
(cl-fad:copy-file first second))
(当然,在CL-FAD包必须被加载)
彼得
第一:不要使用“读”为目的,使用“READ-LINE”。 “读”执行读取宏,这将打开一个安全漏洞。 相反,你需要使用“WRITE-LINE”。
当您使用“READ-LINE”你应该看到,它正是这么做的:它读取只有一个行,并返回或(在你的情况下)的符号“EOF”时,有没有行改为向左。 它还提升您读指针下一个“EOL”后(或类似的东西,我不能很好地流的实现细节精通),所以当你做你的下一个“READ-LINE”在那个流上下一行被读取。 现在,您只需要反复读写,直到遇到文件的末尾。