【Lua 入门基础篇(十)】文件I/O

简介: 笔记

一、文件 I/O


Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。


简单模式(simple model):拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。


完全模式(complete model) :使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。


打开文件操作语句如下:


file = io.open(filename [, mode])


【mode】:10.png

二、简单模式


简单模式使用标准的 I/O 或使用一个当前输入文件和一个当前输出文件。

file = io.open('a.txt', 'r')
io.input(file)
print(io.read()) -- a.txt读入第一行
io.close(file)


file = io.open('a.txt', 'r')
io.output(file)
io.write("lua") -- 输出定向到文件a.txt中
io.close(file)

io.read()参数:

11.png

代码演示:

file = io.open('./a.txt', 'w')
io.output(file)
io.write('zzz\n')
io.write('111\n')
io.write('222\n')
io.write('aaa\n')
io.close(file) -- 保证数据写入file

a.txt:

zzz
111
222
aaa
file = io.open('./a.txt', 'r')
io.input(file)
print("read('*n')", io.read('*n'))
io.close(file)

运行输出;

read('*n')    nil

如果a.txt文件第一行是数字开头(例:12x),那么会读完数字(输出:12)。

file = io.open('./a.txt', 'r')
io.input(file)
print("read('*a')", io.read('*a'))
io.close(file)

运行输出:

read('*a')  zzz
111
222
aaa


其他的 io 方法有:


io.tmpfile():返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除。


io.type(file):检测obj是否一个可用的文件句柄。


io.flush():向文件写入缓冲中的所有数据。


io.lines(optional file name):返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,但不关闭文件。


1. io.lines([filename])

原型:io.lines ([filename])


解释:按文件名以读的模式打开一个文件,并且返回一个迭代函数。这个迭代函数每一次被调用都会返回文件中新的一行的内容,直到文件中所有的内容都被读完。当迭代函数检测到文件末尾时,它会返回nil来结束循环并自动关闭文件。


常用形式(读取整个文件内容):

for line in file do print(line) end

自动关闭文件示例:

local file = io.lines('./a.txt')
print(file())
print(file())
print(file())
print(file())
print(file()) -- nil or 空
-- 到此文件已经自动关闭
-- io.close(file) or file() 都会报错!

三、完全模式

通常我们需要在同一时间处理多个文件。我们需要使用 file:function_name 来代替 io.function_name 方法。


1. file:lines()

lines函数还有另一种表现形式:file:lines()。


如果设置了io.input(file),那么这样就等价于:io.input():lines()。

file = io.open('./a.txt')
for line in file:lines() do print(line) end
io.close()
file = io.open('./a.txt')
io.input(file)
for line in io.input():lines() do print(line) end
io.close()

read 的参数与简单模式一致。


其他方法:


file:seek(optional whence, optional offset):设置和获取当前文件位置,成功则返回最终的文件位置(按字节),失败则返回nil加错误信息。参数【whence】:


“set”: 从文件头开始

“cur”: 从当前位置开始[默认]

“end”: 从文件尾开始

offset:默认为0

不带参数file:seek()则返回当前位置;

file:seek("set")则定位到文件头;

file:seek("end")则定位到文件尾并返回文件大小;


file:flush():向文件写入缓冲中的所有数据。

a.txt

zzz
111
222
aaa
local file = io.open('./a.txt')
file:seek('end', -10)
print(file:read('*a'))
file:close()

运行输出:

1
222
aaa
相关文章
|
1月前
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua的面向对象编程、协同线程与协同函数的概念和使用,以及Lua文件I/O操作的基本方法。
27 4
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
|
5月前
|
XML 编译器 C++
一篇文章讲明白lua文件是什么?
一篇文章讲明白lua文件是什么?
64 1
|
12月前
|
JavaScript 前端开发 C++
[√]lua binding模版文件分析
[√]lua binding模版文件分析
78 0
|
NoSQL 安全 Java
Redis从入门到精通之Lua 脚本
Lua 是一种轻量级的脚本语言,被广泛应用于游戏开发、嵌入式系统、Web 开发、科学计算等领域。Redis 内置了 Lua 解释器,使得用户可以通过编写 Lua 脚本来扩展 Redis 的功能。在 Redis 中,可以使用 EVAL 和 EVALSHA 命令执行 Lua 脚本。
766 7
Redis从入门到精通之Lua 脚本