对文件操作之前要先打开文件
file = io.open(filename[,mode])
filename:要操作的文件与该lua文件的相对位置,
mode:打开文件的方式(具体值见下表),
模式 | 描述 |
---|---|
r | 以只读模式打开文件,改文件必须存在。 |
w | 以只写模式打开,若文件存在则文件长度清为0,即删除文件内容。若文件不存在则建立该文件。 |
a | 以附加的方式打开只写文件。若文件不存在,则新建该文件,若果存在,写入的数据会被加到文件内容尾部,文件原来的内容会被保留。 |
r+ | 以可读写模式打开,该文件必须存在。 |
w+ | 以可读写模式打开,若文件存在删除原内容,若不存在新建文件。 |
a+ | 以可读写模式打开,若文件存在保留文件原内容,写入的数据加到文件内容尾部,若不存在新建文件。 |
b | 二进制模式,如果文件是二进制文件,使用此模式 |
+ | 该符号表示可读可写 |
简单模式
test.lua文件(初始)
hello
hello
readFile = io.open("test.txt","r") //以只读模式打开文件
io.input(readFile)//将文件设为默认的输入文件
readTest = io.read()//读取文件第一行数据
print(readTest)//hello
io.close(readFile)//关闭打开的文件
writeFile = io.open("test.txt","a")//以附加只写模式打开文件
io.output(writeFile)//将文件设为默认的输出文件
io.write("--thank you")//在文件内容尾部加上数据
io.close(writeFile)//关闭打开的文件
test.lua文件(运行一次程序后)
hello
hello--thank you
io.read()也可以传入一些参数来更改读取的模式**:
模式 | 描述 |
---|---|
“*n” | 读取当前指针之后的数字,到当前行尾,若不为数字返回nil |
“*a” | 读取从当前指针位置到文件尾部的字符 |
“*l” | 读取当前指针位置到所在行尾部的字符,再将指针移到下一行(默认为此模式) |
number | 读取指定字符个数的字符串,需要换行时会消耗两个字符 |
test.lua文件
hello
k2333haha
hello2
hello3
readFile = io.open("test.txt","r")
io.input(readFile)
readTest1 = io.read(7)//读取7个字符
readTest2 = io.read("*n")//读取之后到行尾的数字
readTest3 = io.read("*l")//读取到当前行尾,并指到下一行
readTest4 = io.read("*a")//读取之后到文件尾部的字符
print(readTest1)
print("-------------")
print(readTest2)
print("-------------")
print(readTest3)
print("-------------")
print(readTest4)
io.close(readFile)
运行结果
hello
k
-------------
2333
-------------
haha
-------------
hello2
hello3
其它的I/O方法:
io.tmpfile():返回一个临时文件,该文件以更新模式打开,程序结束时自动删除
io.type(file):检测是否为文件类型
io.flush():向文件写入缓冲中的所有数据
io.lines(optional file name):返回一个迭代函数,每次调用将获得文件中的一行内容,若文件尾则返回nil,结束不会关闭文件。
完全模式
需要同时处理多个文件时,使用完全模式
实质与简单模式类似,只是将io.func换为file:func
test.txt文件
hello
hello
file = io.open("test.txt","r")//以只读模式打开test.txt
print("read line1:",file:read())//读取文件第一行内容,指到下一行
print("seek1:",file:seek())//获取当前指针位置
print("seek2:",file:seek("cur",1))//从当前位置前进一位,并返回位置
print("read 5:",file:read(5))//输出之后的5个字符
print("seek3:",file:seek())//获取当前位置
file:close()//关闭文件
file = io.open("test.txt","a")//以附加只写模式打开
file:write("-haha")//在文件尾写入字符串
file:close()//关闭文件
运行结果:
read line1: hello
seek1: 7
seek2: 8
read 5: ello
seek3: 12
file:seek(optional whence,optional offset) 设置和获取当前读取指针位置,成功则返回当前位置,失败返回nil和错误信息。(参数:
whence 是指针移动的相对位置,“set” – 从文件头开始;“cur” – 从当前位置开始(默认);“end” – 从文件尾开始。
offset 是指针从相对位置移动的距离,默认为0,可以是正数或负数。)例:file:seek("end",-6) 就表示指向从结束处倒数6个字符的位置。
file:flush() 向文件写入缓冲中的所有数据
io.lines(optional file) 打开指定文件为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时返回nil,并自动关闭文件。