输入输出
对于文件操作而言,Lua I/O库提供了两种不同模型。
简单I/O模型
简单I/O 模型虚拟了当前输入流和一个当前输出流,其I/O操作在这些流上实现的。默认当前输入流为标准输入流(C的stdin),输出流为标准输出流(C的stdout).
- io.input与io.output可以用于改变当前的输入输出流,调用io.input(file-name) 会以只读模式打开指定的文件,并将其设置为当前输入流,之后所有输入来自该文件,除非再次调用io.input.输出与之类似。若出现错误,只有完整I/O 模型才能处理其抛出的异常。
- io.write用于写入任意数量字符数字到当前输出流。
- io.read从当前输入流中读取,其参数规定了读取的内容。
- “a” 读取整个文件
- “l” 读取下一行(丢弃换行符)
- “L” 读取下一行(保留换行符)
- “n” 读取一个数值
- num 以字符串读取num个字符
注: io.read(0) 是个特例,用于测试是否到达了文件末尾。如果还有数据,则返回一个空字符串,否则返回nil。
同时io.read()可以接受多个参数,根据多个参数返回相应的多个值,若要逐行迭代一个文件,使用io.lines迭代器则会更简单。
a,b,c =io.read("n","n","n")
完整I/O模型
对于同时读写多个文件时,就要使用完整模型了。
(1)io.open 用来打开文件,其仿造了c语言的fopen。两个参数,第一个为待打开文件的名称,另一个为打开的模式(r,w,a,以及一个可选的表示二进制文件的b)。当正确执行时,返回文件流,当错误时,返回nil同时返回一条错误信息和错误码。一般用assert包裹io.open,当出错时,错误信息作为函数assert的第二个参数传入,同时输出错误。
assert(io.open("xxx.txt","r"))
--输出
nil xxx.txt: No such file or directory 2
xxx.txt: No s