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


    在这里插入图片描述
    在这里插入图片描述

    一、文件 I/O

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

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

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

    打开文件操作语句如下:

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

    【mode】:

    在这里插入图片描述


    二、简单模式

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

    file = io.open('a.txt', 'r')
    io.input(file)
    print(io.read()) -- a.txt读入第一行
    io.close(file)
    
    • 1
    • 2
    • 3
    • 4
    file = io.open('a.txt', 'r')
    io.output(file)
    io.write("lua") -- 输出定向到文件a.txt中
    io.close(file)
    
    • 1
    • 2
    • 3
    • 4

    io.read()参数:

    在这里插入图片描述
    代码演示:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    a.txt:

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

    运行输出;

    read('*n')		nil
    
    • 1

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


    file = io.open('./a.txt', 'r')
    io.input(file)
    print("read('*a')", io.read('*a'))
    io.close(file)
    
    • 1
    • 2
    • 3
    • 4

    运行输出:

    read('*a')		zzz
    111
    222
    aaa
    
    • 1
    • 2
    • 3
    • 4

    其他的 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
    
    • 1
    • 自动关闭文件示例:
    local file = io.lines('./a.txt')
    
    print(file())
    print(file())
    print(file())
    print(file())
    print(file()) -- nil or 空
    
    -- 到此文件已经自动关闭
    -- io.close(file) or file() 都会报错!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、完全模式

    通常我们需要在同一时间处理多个文件。我们需要使用 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()
    
    • 1
    • 2
    • 3
    file = io.open('./a.txt')
    io.input(file)
    for line in io.input():lines() do print(line) end
    io.close()
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4
    local file = io.open('./a.txt')
    file:seek('end', -10)
    print(file:read('*a'))
    file:close()
    
    • 1
    • 2
    • 3
    • 4

    运行输出:

    1
    222
    aaa
    
    • 1
    • 2
    • 3
  • 相关阅读:
    算法训练(leetcode)第二十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
    MATLAB初步进行机器学习
    Sql注入的基础
    日志11.01查看项目构造,理解SpringBoot 中的mapper,service,controller,model
    Vue基于django的超时代停车场管理系统python
    haproxy+keepalived搭建和配置
    Electron 从基础到实战笔记 - Electron App对象及其事件
    SpringBoot中@ConfigurationProperties注解的常见使用(学习笔记)
    4.2 Windows驱动开发:内核中进程线程与模块
    面试官:Spring中获取Bean有几种方式?
  • 原文地址:https://blog.csdn.net/qq_52678569/article/details/125782347