Io 库教程 |
|
I/O 库提供了两种不同的文件操作风格。第一种使用隐式文件描述符,即存在设置默认输入文件和默认输出文件的操作,所有输入/输出操作都在这些默认文件上进行。第二种风格使用显式文件描述符。
使用隐式文件描述符时,所有操作都由表 io
提供。使用显式文件描述符时,操作 io.open
返回一个文件描述符,然后所有操作都由文件描述符作为方法提供。
表 io
还提供了三个预定义的文件描述符,它们具有来自 C 的通常含义:io.stdin
、io.stdout
和 io.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
。当不带格式调用时,它使用一个默认格式,该格式读取下一行的全部内容(见下文)。
可用的格式有
nil
。这是默认格式。
nil
。如果 number 为零,则不读取任何内容并返回空字符串,或在文件结尾返回 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`。