Lua学习笔记-文件读写

来源:互联网 发布:淘宝c店被方正字体投诉 编辑:程序博客网 时间:2024/05/09 05:31

背景:

采用Lua进行文件读和写操作,最终简单模拟文件的复制操作。

第一大类:IO表调用方式

1、

简单读写模式:

io.input([file]) 设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为把柄,有了把柄就可以找到文件),返回文件句柄。读操作。

io.output([file]) 设置默认的输出文件,写操作时候用。

io.close([file]) 关闭文件,不带参数关闭默认的文件

io.read(formats) 读入默认文件,formats取值为”*a”(读入全部)、“*n”(按数字读入)、 “*l”(按行读入,默认方式)、n(即数字,读取n个字符)。

io.lines([fn]) fn文件名,若无文件,取默认文件,返回一个迭代器,可以用在for循环里。

io.write(value)向默认文件写入内容。写操作时候用。

io.flush() 把文件缓存里的操作立即作用到默认输出文件。

例子:

--读操作local file1=io.input("Jdataresult.txt")  --当前目录"Jdataresult.txt"要存在,不然出错local str=io.read("*a")print(file1)print(str);--一次性打印出文件中的内容--写操作local file2=io.output("2.txt") --当前目录"2.txt"不需要存在io.write(str)io.flush()io.close()

read是对当前输入文件的处理,当没有当前文件时候,则为屏幕的IO。

使用如下所示:

代码:

–[read函数的使用方法]
– oneline=io.read(“*line”)
– print(oneline)–将从屏幕读取的字符串,打印出来。回车作为结束符。因为是读取一行而已

– oneline=io.read(“*all”)–这种方式的话,则没有结束符进行识别,所以只能进行中断
– print(oneline)

– oneline=io.read(“*number”)– 调用io.read(“*number”)会从当前输入文件中读取一个数字。此时read将直接返回一个数字,而不是字符串。”*number”选项会忽略数字前面所有的空格,并且能处理像-3、+5.2这样的数字格式
– print(oneline)–如果输入第一个是非数字的话,则返回nil。如果输入123,会将123视为一个数字,123a,则会将a忽略,只提取123

– oneline=io.read(5)–调用io.read()会从输入文件中最多读取n个字符,如果读不到任何字符,返回nil。否则返回读取到的字符串
– print(oneline)

–io.read(0)是一种特殊的情况,用于检查是否到达了文件的末尾。如果没有到达,返回空字符串,否则nil。

采用以下方式对文本进行遍历:

local file1=io.input("2.txt")for oneline in io.lines() do    print(oneline)end--read方式,下面这种方式需要先将上面的代码先注释掉,否则此时的文件已经移动到末尾了,下面的方式读取结果将会是nilprint("另一种方式:\r")for count=1,math.huge  do    oneline=io.read("*line")    print(oneline)    if oneline == nil then        break    endend

如果采用io.lines的方式,竟然出现了首个字符丢失的情况。目前不知道是何原因?有待排查:

代码:

list=nilfor line in io.lines("2.txt") do --若不带参数时io.lines() <=> io.input():lines(); 读取默认输入设备的内容,但结束时不关闭文件    print(line)    list={next=list,value=line}end-- 从标准输入读取每行。然后反序形成链表,打印如下--list的输出结果print("List的输出结果:\r")l=listwhile l do    print(l.value)--为何第一个字符没有了??    l=l.nextend

–输入结束符呢?

2、

完整模型

简单模型里只能处理文本类型的文件,在完整模型里可以处理二进制文件。

处理文件的一般流程为:打开文件,获取文件的句柄;以文件句柄操作文件;关闭文件。

可以看到完整模型比简单模型复杂点,但优点是功能更强大。

io.open (fn [, m]) 打开文件,返回文件句柄,fn文件名,m模式有:

r 以只读方式打开文件,该文件必须存在。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

r+ 以可读写方式打开文件,该文件必须存在。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a+ 与a类似,但此文件可读可写

b 二进制模式,如果文件是二进制文件,可以加上b

  • 号表示对文件既可以读也可以写

以下的file是io.open返回的文件句柄,功能与简单模式类似,不再详述。

file :close ()

file :read ( formats )

file :lines ()

file :write ( values )

file :seek ([p] [, of]) 设置文件读写的偏移,p文件偏移起始位置(取值有”set”,文件头,此为默认值,”cur”当前位置、”end”文件尾),of偏移量(默认值0,正的表示向前,负的表示向后),返回在文件里新的当前位置。

file :flush ()

上述的方式都是io表调用方式,即使用io表,io.open将返回指定文件的描述,并且所有的操作将围绕这个文件描述。io表同样提供三种预定义的文件描述io.stdin,io.stdout,io.stderr
简单模型里只能处理文本类型的文件,在完整模型里可以处理二进制文件。

第二大类:文件句柄调用方式

另外一种方式则是文件句柄直接调用方式,使用file:XXX()函数方式进行操作,其中file为io.open()返回的文件句柄。

未完,待续!

0 0
原创粉丝点击