21.2 完全I/O 模式

为了对输入输出的更全面的控制,可以使用完全模式。完全模式的核心在于文件句柄(file handle)。该结构类似于C语言中的文件流(FILE*),其呈现了一个打开的文件以及当前存取位置。打开一个文件的函数是io.open。它模仿C语言中的fopen函数,同样需要打开文件的文件名参数,打开模式的字符串参数。模式字符串可以是 "r"(读模式),"w"(写模式,对数据进行覆盖),或者是 "a"(附加模式)。并且字符 "b" 可附加在后面表示以二进制形式打开文件。正常情况下open函数返回一个文件的句柄。如果发生错误,则返回nil,以及一个错误信息和错误代码。

print(io.open("non-existent file", "r"))

    --> nil    No such file or directory       2

 

print(io.open("/etc/passwd", "w"))

    --> nil    Permission denied               13

错误代码的定义由系统决定。

以下是一段典型的检查错误的代码:

local f = assert(io.open(filename, mode))

如果open函数失败,错误信息作为assert的参数,由assert显示出信息。文件打开后就可以用readwrite方法对他们进行读写操作。它们和io表的read/write函数类似,但是调用方法上不同,必须使用冒号字符,作为文件句柄的方法来调用。例如打开一个文件并全部读取。可以使用如下代码。

local f = assert(io.open(filename, "r"))

local t = f:read("*all")

f:close()

C语言中的流(stream)设定类似,I/O库提供三种预定义的句柄:io.stdinio.stdoutio.stderr。因此可以用如下代码直接发送信息到错误流(error stream)。

io.stderr:write(message)

我们还可以将完全模式和简单模式混合使用。使用没有任何参数的io.input()函数得到当前的输入文件句柄;使用带有参数的io.input(handle)函数设置当前的输入文件为handle句柄代表的输入文件。(同样的用法对于io.output函数也适用)例如要实现暂时的改变当前输入文件,可以使用如下代码:

local temp = io.input()     -- save current file

io.input("newinput")        -- open a new current file

...                         -- do something with new input

io.input():close()          -- close current file

io.input(temp)              -- restore previous current file


相关链接:
lua程序设计目录 - 中国lua开发者 - lua论坛