六 输入输出

2020-12-17  本文已影响0人  愤愤的有痣青年

1. 简单的I/O模型

io.readio.write是从流中读入和输出数据的函数,使用io.inputio.output可以指定输入输出流的文件来源,若不设置此参数,则默认为从当前的输入输出流.
因此在不设置io.input的情况下可以使用io.read()来读取用户的输入,使用io.write来输出数据.

io.write

> io.write("hello world") --> hello worldfile (0x7f571b920620)
> io.output("test.txt")
> io.write("hello world") --> file (0x10ba1b0)
> io.close() --> true # 此时输出数据到了文本test.txt中

io.read

> io.read() --> # 此时会阻塞,并等待用户的输入
> io.input("test.txt")
> io.read() --> hello world

io.read函数中,还可以指定参数,该参数决定要读取的数据:

参数 说明
"a" 读取整个文件
"l" 读取下一行(舍弃换行符)
"L" 读取下一行(保留换行符)
"n" 读取一个数值
num 以字符串读取num个字符

io.lines

io.lines函数是将文件作为一个迭代器返回,可以对其进行循环读取

io.input("test.txt")
for line in io.lines() do
  print(line)
end

io.lines函数中可以接收同io.read一样的参数.

完整I/O模型

简单的I/O模型无法应对需要同时对多文件进行处理的场景,对此就需要使用完整了个I/O模型.
可以使用函数io.open来打开一个文件,其仿照了 C语言的fopen函数,因此其使用方式都是大同小异.其接收两个参数,一个是文件名,还有一个是打开的模式,如io.open("name", "r"),其中关于模式的说明如下:

模式字符 说明
"r" 只读打开
"w" 只写打开
"a" 追加
"b" 可选模式,以二进制的形式打开

io.open函数如果执行失败,其会返回三个参数,分别是nil 错误信息 错误码,如下

> print(io.open("不存在的文件","r"))
nil 不存在的文件: No such file or directory   2
> print(io.open("/etc/passwd","w"))
nil /etc/passwd: Permission denied  13

使用io.open方式打开一个文件后,可以使用readwrite来读取和写出文件,其使用方式同f.read f.write类似,但但是需要使用冒号运算符将其作为流对象的方法来调用.

> local f=io.open("test.txt","rb")
> local t=f:read("a")
> print(t) --> hello world
> f:close()

I/O库提供了三个预定义的C语言流句柄:io.stdin io.stdout和io.stderr. 例如.可以使用如下代码来讲信息写到标准错误流中:
io.stderr:write("error info")

其他文件操作

function fsize(file)
    local cur = file:seek() -- 保存当前位置
    local size = file:seek("end") --  获取文件大小
    file:seek("set", cur) -- 恢复文件位置
    return size
end

其他系统调用

function files()
    local f = io.popen('ls ./', 'r')
    local files = {}
    for file in f:lines() do
        files[#files+1] = file
    end
    return files
end
上一篇下一篇

猜你喜欢

热点阅读