Io 库教程 |
|
I/O 库提供了两种文件操作风格。第一种使用隐式文件描述符,也就是说,有操作用于设置默认输入文件和默认输出文件,所有输入/输出操作都作用于这些默认文件。第二种风格使用显式文件描述符。
在使用隐式文件描述符时,所有操作都由 `io` 表提供。在使用显式文件描述符时,`io.open` 操作会返回一个文件描述符,然后所有操作都作为文件描述符的方法提供。
`io` 表还提供了三个预定义的 C 风格文件描述符:`io.stdin`、`io.stdout` 和 `io.stderr`。
文件描述符是一个包含文件流 `(FILE*)` 的 userdata,它有一个由 I/O 库创建的特殊元表。
除非另有说明,所有 I/O 函数在失败时返回 `nil`(外加一个错误消息作为第二个返回值),在成功时返回非 `nil` 的值。
file = io.open (filename [, mode])
此函数以指定模式打开一个文件。它返回一个新的文件描述符,或在出错时返回 `nil` 和一个错误消息。
模式字符串可以是以下任何一种:
模式字符串末尾还可以有一个 `b`,在某些系统上需要它以二进制模式打开文件。此字符串与标准 C 函数 `fopen` 使用的完全相同。
io.close ([file])
等同于 `file:close`。不带文件参数时,关闭默认输出文件。
io.flush ()
等同于对默认输出文件执行 `file:flush`。
io.input ([file])
当使用文件名调用时,它打开指定文件(文本模式),并将其用作默认输入描述符。当使用文件描述符调用时,它仅将该文件描述符设置为默认输入文件。当不带参数调用时,它返回当前默认输入文件描述符。
在此函数出错时,它会抛出错误,而不是返回错误代码。
io.lines ([filename])
打开给定文件名(以读模式)并返回一个迭代器函数,每次调用时,该函数都会从文件中返回一行新内容。因此,构造
for line in io.lines(filename) do ... end
将遍历文件的所有行。当迭代器函数检测到文件末尾时,它会关闭文件并返回 `nil`(以结束循环)。
调用 `io.lines()`(不带文件名)等同于 `io.input():lines()`,即遍历默认输入文件的行。
io.output ([file])
类似于 `io.input`,但作用于默认输出文件。
io.read (format1, ...)
等同于 `io.input():read`。
io.tmpfile ()
返回一个临时文件的描述符。该文件以更新模式打开,并在程序结束时自动删除。
io.type (obj)
检查 `obj` 是否为有效的文件描述符。如果 `obj` 是一个打开的文件描述符,则返回字符串 `"file"`;如果 `obj` 是一个已关闭的文件描述符,则返回 `"closed file"`;如果 `obj` 不是文件描述符,则返回 `nil`。
io.write (value1, ...)
等同于 `io.output():write`。
f:close ()
关闭文件 `f`。
f:flush ()
将写入的任何数据保存到文件 `f`。
f:lines ()
返回一个迭代器函数,每次调用时,它会从文件 `f` 返回一行新内容。因此,构造
for line in f:lines() do ... end
将遍历文件 `f` 的所有行。(与 `io.lines` 不同,此函数在循环结束时不会关闭文件。)
f:read (format1, ...)
根据给定的格式读取文件 `f`,格式指定了要读取的内容。对于每种格式,函数将返回一个包含读取的字符的字符串(或数字),如果无法按指定格式读取数据,则返回 `nil`。如果不带格式调用,它将使用默认格式读取下一行的全部内容(见下文)。
可用格式如下:
f:seek ([whence] [, offset])
设置并返回文件 `f` 的索引位置,该位置相对于文件开头,偏移量为 `offset` 加上由 `whence` 字符串指定的基准,如下所示:
成功时,`seek` 函数返回最终文件位置,以字节为单位,相对于文件开头。如果此函数失败,它将返回 `nil`,以及描述错误的字符串。
`whence` 的默认值是 `"cur"`,`offset` 的默认值是 0。因此,调用 `file:seek()` 返回当前文件位置而不更改它;调用 `file:seek("set")` 将位置设置为文件开头(并返回 0);调用 `file:seek("end")` 将位置设置为文件末尾,并返回其大小。
f:write (value1, ...)
将每个参数的值写入文件 `f`。参数必须是字符串或数字。要写入其他值,请在写入前使用 `tostring` 或 `string.format`。