Lua文件的I/O

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DY_1024/article/details/81274788

在Lua里面,读取文件分两个模式:简单模式 和 完全模式。

简单模式:拥有当前一个读入文件和读出文件,在Lua I/O库里面提供相关的一些简单的操作。

完全模式:使用文件的句柄对文件进行操作。

区别在于:简单模式中对文件的操作比较少,适合对单一的文件做处理。如果我们同时对多个文件进行处理的,就需要使用我们的完全模式。

打开文件的模式(mode)有很多种:

r 以只读方式打开文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+ 以可读写方式打开文件,该文件必须存在。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+ 与a类似,但此文件可读可写
b 二进制模式,如果文件是二进制文件,可以加上b
+ 号表示对文件既可以读也可以写

Lua的 I/O里面提供的接口大多都是两个参数:第一个就是我们需要操作的文件,第二个就是我们表中介绍的模式

简单模式

现在我们在file.lua 里面操作test.lua文件

--注意test.lua文件的路径
--“./test.lua”表示当前路径
--"../test.lua"表示当前路径的上一级路径
--因为我的.lua文件放在Lua解析器的上一级目录,所以我需要使用"../test.lua"


--因为我们第一次打开文件的模式使用的是:'r',所以文件必须存在,如果没有我们需要自己提前创建
-- 以只读方式打开文件
file = io.open("test.lua", "r")


-- 设置默认输入文件为 test.lua
io.input(file)

--如果我们创建的文件里面没有任何的内容,那就是:nil
-- 输出文件第一行
print(io.read())

-- 关闭打开的文件
io.close(file)


--'a'模式打开文件,如果没有文件则会创建,如果有,那么写入数据就会在文件的末尾
-- 以附加的方式打开只写文件
file = io.open("test.lua", "a")

-- 设置默认输出文件为 test.lua
io.output(file)

-- 在文件最后一行添加 Lua 注释
io.write("--  test.lua 文件末尾注释")

-- 关闭打开的文件
io.close(file)

注意:函数io.raed()没有带参数,这个函数的参数介绍如下:

" *n " 读取一个数字并返回它。例:file.read("*n")
" *a " 从当前位置读取整个文件。例:file.read("*a")
" *l "(默认) 读取下一行,在文件尾 (EOF) 处返回 nil。例:file.read("*l")
number 返回一个指定字符个数的字符串,或在 EOF 时返回 nil。例:file.read(5)

当我们执行完上面的代码,就可以打开test.lua文件看一下,里面就会有:“--  test.lua 文件末尾注释”这句话。

上面介绍的是比较常用的几个IO,还有几个IO介绍如下:

① io.tmpfile():返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除

扫描二维码关注公众号,回复: 3867340 查看本文章

② io.type(file): 检测obj是否一个可用的文件句柄

③ io.flush(): 向文件写入缓冲中的所有数据

④ io.lines(optional file name): 返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,但不关闭文件

完全模式

当我们需要同时对多个文件进行处理,就需要用到我们的完全模式。

代码的区别就是:一个使用io去调用接口,一个是使用文件句柄去调用接口,使用io的话就只能操作一个文件了,使用句柄的话就可以操作多个文件了,谁的句柄去掉用接口,就会去操作哪个文件。

--首先要注意的地方和之前简单模式一样就是"test.lua"文件的路径,其次就是第一次打开"test.lua"文件的模式,要注意是自己创建还是程序帮忙创建

-- 以只读方式打开文件
file = io.open("../test.lua", "r")


--file.read()的参数还是没有选择,这里面的参数和之前简单模式的参数一样,参考之前给出的read接口参数的表格就行
-- 输出文件第一行
print(file:read())

-- 关闭打开的文件
file:close()

-- 以附加的方式打开只写文件
file = io.open("../test.lua", "a")

-- 在文件最后一行添加 Lua 注释
file:write("--test")

-- 关闭打开的文件
file:close()

执行完上面的代码,在test.lua文件里面就可以看到:"--  test.lua 文件末尾注释"这句话了。

其他方法:

①:file:seek(optional whence, optional offset): 设置和获取当前文件位置,成功则返回最终的文件位置(按字节),失败则返回nil加错误信息。参数 whence 值可以是:

"set": 从文件头开始
"cur": 从当前位置开始[默认]
"end": 从文件尾开始
offset:默认为0
不带参数file:seek()则返回当前位置,file:seek("set")则定位到文件头,file:seek("end")则定位到文件尾并返回文件大小
②file:flush(): 向文件写入缓冲中的所有数据

③io.lines(optional file name): 打开指定的文件filename为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,并自动关闭文件。
若不带参数时io.lines() <=> io.input():lines(); 读取默认输入设备的内容,但结束时不关闭文件,如


for line in io.lines("main.lua") do

  print(line)

  end

猜你喜欢

转载自blog.csdn.net/DY_1024/article/details/81274788