输入输出
IO文件读写:打开关闭、按行读取、定位与缓冲 | 本页 20 个接口。登录全站学员账号后:给函数打 ✓ 记录学习进度、写私人备注。
关闭文件(省略参数关闭默认输出文件)。文件用完必须关闭,否则可能丢缓冲数据。
| 参数 | 说明 |
|---|---|
| file | 文件句柄,省略为默认输出 |
成功 true;失败 nil+错误
local f = io.open('a.txt', 'w')
f:write('数据')
io.close(f)把默认输出文件的所有缓冲数据立刻写入磁盘。
无参数
成功 true
io.write('重要数据')
io.flush()设置/获取默认输入文件。传文件名打开它,传句柄切换到它;无参返回当前句柄。io.read 从这里读。
| 参数 | 说明 |
|---|---|
| file | 文件名 或 句柄,省略为查询 |
当前输入句柄
io.input('in.txt')
print(io.read('*l')) -- 读一行按行迭代文件内容(迭代器读完自动关闭文件)。逐行处理文本最简洁的写法。
| 参数 | 说明 |
|---|---|
| filename | 文件名,省略为默认输入 |
| ... | 读取格式,同 io.read |
迭代函数
for line in io.lines('log.txt') do
if line:find('ERROR') then print(line) end
end打开文件返回句柄。mode:"r"读(默认)/"w"写(清空)/"a"追加;带 + 可读写;加 b 二进制。失败返回 nil+错误。996 服务端 io 路径被沙箱限制在 Envir\ 内。
| 参数 | 说明 |
|---|---|
| filename | 文件路径 |
| mode | 打开模式 r/w/a (+b) |
文件句柄;失败 nil, err
local f = assert(io.open('log.txt', 'a'))
f:write('新记录\n')
f:close()
local g, err = io.open('不存在.txt', 'r')
print(g, err) --> nil 无法打开...设置/获取默认输出文件(io.write 写到这里)。用法同 io.input。
| 参数 | 说明 |
|---|---|
| file | 文件名 或 句柄,省略为查询 |
当前输出句柄
io.output('out.txt')
io.write('写入内容')
io.output():close()执行外部程序并返回其输入输出句柄(很多受限环境禁用此函数)。
| 参数 | 说明 |
|---|---|
| prog | 命令行 |
| mode | "r" 读输出(默认) / "w" 写输入 |
文件句柄
local f = io.popen('dir')
print(f:read('*a'))
f:close()从默认输入读取。格式:"*l" 一行(默认)/"*n" 一个数字/"*a" 全部;数字 n 读取 n 个字符。控制台交互用。
| 参数 | 说明 |
|---|---|
| ... | 读取格式串 |
读到的内容
local line = io.read('*l') -- 读一行
local num = io.read('*n') -- 读一个数字标准错误输出的文件句柄(常量)。写入的内容用于报错通道。
无参数
(句柄常量)
io.stderr:write('警告信息\n')标准输入句柄(常量)。
无参数
(句柄常量)
local line = io.stdin:read('*l')标准输出句柄(常量)。print 底层就是写到这里。
无参数
(句柄常量)
io.stdout:write('直接输出\n')打开一个临时文件(可读写),程序结束或关闭后自动删除。
无参数
文件句柄
local f = io.tmpfile()
f:write('临时数据')
f:seek('set')
print(f:read('*a'))判断 obj 是否文件句柄:是则返回 "file"(打开)/ "closed file"(已关闭);不是返回 nil。(type() 对句柄只会说 userdata)
| 参数 | 说明 |
|---|---|
| obj | 任意值 |
"file" / "closed file" / nil
local f = io.open('a.txt')
print(io.type(f)) --> file
f:close()
print(io.type(f)) --> closed file
print(type(f)) --> userdata关闭文件句柄,释放系统资源并刷掉缓冲。关闭后句柄不可再读写(io.type 变 "closed file")。
无参数
成功 true
local f = io.open('a.txt', 'r')
local data = f:read('*a')
f:close()立刻把该文件缓冲区里的数据写盘。重要数据写完马上 flush,防止断电/崩溃丢失。
无参数
成功 true
f:write('关键日志')
f:flush()与 io.lines 相同,但作用于该句柄;迭代结束不会自动关闭文件(io.lines 会)。
| 参数 | 说明 |
|---|---|
| ... | 读取格式串 |
迭代函数
local f = io.open('log.txt')
for line in f:lines() do print(line) end
f:close()按格式从该文件读数据:"*a" 读完整个文件 / "*l" 一行(去掉换行) / "*n" 读一个数字 / 数字n 读 n 字节。到文件尾返回 nil(*a 返回空串)。
| 参数 | 说明 |
|---|---|
| ... | 格式串,多个则依次读取 |
读取的内容
local f = io.open('cfg.txt')
local all = f:read('*a') -- 一次读完
f:close()移动/查询文件位置。whence:"set" 文件头 / "cur" 当前 / "end" 文件尾。offset 相对偏移。省略参数即查询当前位置。文件大小 = seek("end")。
| 参数 | 说明 |
|---|---|
| whence | 基准位置 set/cur/end,默认 cur |
| offset | 偏移字节,默认 0 |
新的位置(相对文件头的字节偏移)
local f = io.open('big.txt')
print(f:seek('end')) --> 文件大小(字节)
f:seek('set', 0) -- 回到开头
f:close()设置缓冲模式:"no" 不缓冲(每个写操作立即生效) / "full" 满 size 才刷 / "line" 按行刷。
| 参数 | 说明 |
|---|---|
| mode | no/full/line |
| size | 缓冲区字节数 |
成功 true
f:setvbuf('no') -- 关闭缓冲, 写入立即生效把所有参数(字符串或数字)按顺序写入该文件。数字不会自动加空格。写入位置由 file:seek 决定。
| 参数 | 说明 |
|---|---|
| ... | 字符串或数字 |
该文件句柄(可链式调用)
local f = io.open('a.txt', 'w')
f:write('等级=', 35, '\n')
f:write('金币=', 1000, '\n')
f:close()