I/O中的一些问题的研究

来源:互联网 发布:免实名域名注册 编辑:程序博客网 时间:2024/06/05 00:42

file-position 接受一个打开的流,然后返回文件的当前位置,也就是读取或者写入该流的元素的数量。

1:从io4.db中往io3.db中输入数据,并且显示读入和写入的元素的数量。下面是我考到wps中,输出显示格式,你发现他在第二个引号换行了,然后他后面也换行了。在后面换行的话,正常,因为在write-line的时候,他会给字符串加上一个换行符,然后我就测试了一下在wps的doc里面是不是碰见13 CR也同样会换行,也就是说现在wps中的doc里面碰见13CR/10LF中任何一个都会换行。

CL-USER>  (with-open-file (out "d:/emacs/io3.db"       :direction :output       :if-exists :supersede)   (with-open-file (in "d:/emacs/io4.db")     (loop for line = (read-line in nil)while linedo(format t "in file-position : ~s~%" (file-position in))  (write-line line out)  (format t "out file-position : ~s~%" (file-position out))  (format t "~s~%" line))))in file-position : 7out file-position : 7"nihao"in file-position : 13out file-position : 13"lili"in file-position : 15out file-position : 16"hi"NIL
验证在wps中的doc里面碰见13CR/10LF中任何一个都会换行。

CL-USER> (with-open-file (out "d:/emacs/io.doc"       :direction :output       :if-exists :supersede       :element-type '(unsigned-byte 8))     (loop repeat 10do(write-byte (read *query-io* nil) out)  (format t "out file-position : ~s~%" (file-position out))))97out file-position : 113out file-position : 298out file-position : 310out file-position : 499out file-position : 5100out file-position : 613out file-position : 7101out file-position : 810out file-position : 9101out file-position : 10NIL
最后在doc中显示形式如下,也就是当10/13时都换行了。
a
b
cd
e
e

验证在txt里面13CR/10LR的效果

CL-USER> (with-open-file (out "d:/emacs/io3.txt"       :direction :output       :if-exists :supersede       :element-type '(unsigned-byte 8))     (loop repeat 12do(write-byte (read *query-io* nil) out)  (format t "out file-position : ~s~%" (file-position out))))97out file-position : 110out file-position : 298out file-position : 313out file-position : 499out file-position : 513out file-position : 610out file-position : 7100out file-position : 810out file-position : 913out file-position : 10101out file-position : 11102out file-position : 12NIL
在io3.txt里面的形式,但是如果你再把下面的结果再放到doc他又会是另一种形式,因为13/10仍旧是存在的,只是不显示出来,我又把io3.txt按二进制流读了出来。可以看到13/10都在,所以说在wps中会是另一种景象。


CL-USER>  (let ((in (open "d:/emacs/io3.txt" :element-type '(unsigned-byte 8))))     (loop for c = (read-byte in nil)        while c        do(format t "~a" c))     (close in))  971098139913101001013101102T
2:上面说的是wps中编码的情况,下面说一下为啥写了16个而却只读了15个字符?
因为当readline的时候,他会把newline去掉然后把剩下的封装成string作为值。(readline可以佐证因为只有13才会输出显示^M)。同时如果你把io3.db按照原样二进制流输出最后一个字符为10,也就是newline.因为write-line会给字符串加上一个newline,所以你才会发现前面收支是平衡的,直到读最后一行时,因为源文件的最后一行没有换行符,而在write-line的时候给他加了一个newline,所以也就多了一个。

我按二进制流输出刚才写入到的io3.db中的内容你发现却是多了一个10

CL-USER> (let ((in (open "d:/emacs/io3.db" :element-type '(unsigned-byte 8))))     (loop for c = (read-byte in nil)        while c        do(format t "~a" c))     (close in))  110105104971111310108105108105131010410510T
第二种佐证方式:既然read-line他会剔除newline10,那么我们就看一下read-line的结果是不是却是少了10.而我为啥用图片呢?因为我发现如果我粘代码跟结果的话,最后结果显示是图片下面的那个形式。也就是说本身csdn里面碰到13也是会换行的。图片中确实是多了一个^M,我上一篇已经说了^M是13.


"nihao""lili""hi"NIL
3:其实我现在一直有个疑问,就是如果你直接复制repl中的代码粘贴到本地的txt,他格式不变。因为在txt里面换行是1310,为啥在repl时候他没有显示为^M形式呢?下面是我从cl-user后面剪切一段代码然后放到txt里面的输出形式输出结果
CL-USER> (let ((in (open "d:/emacs/test.txt" :element-type '(unsigned-byte 8))))     (loop for c = (read-byte in nil)        while c        do(format t "~a" c))     (close in))  40108101116324040105325241411310932323240494141
源文件:
(let ((i 4))
   (1))

总结:with-open-file可以进行嵌套同时对多个流进行控制,只是注意他们的语法作用域。

            (read *query-io* nil)读取从键盘端输入的数据,(write-line *query-io*)输出显示到显示器上面

            wps/csdn/txt 他们碰到13/10字符时的效果不一样。

原创粉丝点击