Io 库教程

lua-users home
wiki

输入和输出设施

I/O 库提供了两种不同的文件操作风格。第一种使用隐式文件描述符,即存在设置默认输入文件和默认输出文件的操作,所有输入/输出操作都在这些默认文件上进行。第二种风格使用显式文件描述符。

使用隐式文件描述符时,所有操作都由表 io 提供。使用显式文件描述符时,操作 io.open 返回一个文件描述符,然后所有操作都由文件描述符作为方法提供。

io 还提供了三个预定义的文件描述符,它们具有来自 C 的通常含义:io.stdinio.stdoutio.stderr

文件描述符是一个用户数据,包含文件流 (FILE*),并具有由 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` 的索引位置,该位置从文件开头开始计算,到由偏移量加上由字符串 `whence` 指定的基准位置,如下所示

如果成功,函数 `seek` 将返回最终的文件位置,该位置以字节为单位从文件开头计算。如果此函数失败,它将返回 `nil`,以及描述错误的字符串。

`whence` 的默认值为 `“cur”`,`offset` 的默认值为 0。因此,调用 `file:seek()` 将返回当前文件位置,而不改变它;调用 `file:seek("set")` 将将位置设置为文件开头(并返回 0);调用 `file:seek("end")` 将将位置设置为文件结尾,并返回其大小。

f:write (value1, ...)

将每个参数的值写入文件 `f`。参数必须是字符串或数字。要写入其他值,请在写入之前使用 `tostring` 或 `string.format`。

另请参阅


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2010 年 9 月 18 日下午 6:56 GMT (差异)