第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些不同之处。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目


21.2 – 完整的 I/O 模型

要对 I/O 进行更多控制,您可以使用完整模型。此模型中的一个核心概念是文件句柄,它等效于 C 中的流 (FILE*):它表示具有当前位置的打开文件。

要打开文件,请使用 io.open 函数,它模仿 C 中的 fopen 函数。它接收要打开的文件的名称以及模式字符串作为参数。该模式字符串可能包含用于读取的 `r´、用于写入(这也将擦除文件的所有先前内容)的 `w´ 或用于追加的 `a´,以及用于打开二进制文件的可选 `b´。open 函数返回文件的新句柄。如果出现错误,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,然后显示该消息。

打开文件后,您可以使用 read/write 方法从该文件读取或向该文件写入。它们类似于 read/write 函数,但您使用冒号语法在文件句柄上调用它们作为方法。例如,要打开文件并全部读取,可以使用如下代码块

    local f = assert(io.open(filename, "r"))
    local t = f:read("*all")
    f:close()

I/O 库还为三个预定义的 C 流提供句柄:io.stdinio.stdoutio.stderr。因此,您可以使用如下代码将消息直接发送到错误流

    io.stderr:write(message)

我们可以将完整模型与简单模型混合使用。通过调用io.input()(无参数)来获取当前输入文件句柄。我们使用调用io.input(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