Lua的输入输出、补充知识

输入输出

单就Lua语言而言,只提供了ISO C语言标准支持的功能,即基本的文件操作等。

简单I/O模型

简单模型虚拟了一个当前输入流和一个当前输出流。函数io.input和函数io.output可以用于改变当前的输入输出流,调用io.input会以只读模式打开指定文件,并将文件设置为当前输入流。之后所有的输入都将来自该文件,除非再次调用io.input

io.write

函数io.write可以读取任意数量的字符串并将其写入当前输入流。由于调用函数时可以使用多个参数,因此应尽量避免使用连接操作符以节省资源。

作为原则,应该只在”用后即弃”的代码中使用函数print,当需要完全控制输出时,应该使用函数io.write。

io.read
参数 操作
“a” 读取整个文件
“l” 读取下一行(丢弃换行符)
“L” 读取下一行(保留换行符)
“n” 读取一个数值
Num 以字符串读取num个字符

调用io.read("a")可从当前位置开始读取当前输入文件的全部内容,如果当前处于文件末尾或者文件为空,那么该函数返回一个空字符串。

完整I/O模型

可以使用函数io.open来打开一个文件,这个函数有两个参数,一个参数是待打开文件的文件名,另一个参数是一个模式字符串,包括表示只读的r,表示只写的w,表示追加的a,以及一个可选的表示打开二进制文件的b。

补充知识

局部变量和代码块

Lua中的变量在默认情况下是全局变量,所有的局部变量在使用前必须声明。

  • 局部变量可以避免由于不必要的命名而造成全局变量的混乱。
  • 局部变量还能避免同一程序中不同代码部分的命名冲突
  • 访问局部变量比访问全局变量更快
  • 局部变量会随着其作用域的结束而消失,使得垃圾收集器能够将其释放

控制结构

  • if then else

  • elseif

  • while

  • repeat-until:类似于do-while

  • 数值型for:

    1
    2
    3
    for var = exp1,exp2,exp3 do
    something
    end

    var值从exp1变化到exp2之前的每次循环会执行something,并在每次循环结束后将步长exp3增加到var上,如果exp3不存在则默认为1,不想设置循环上限,可以使用math.huge。

  • 泛型for:

    泛型for遍历迭代函数返回的所有值,例如pairsipairsio.lines等。

  • break、return、goto:标签形如::name::