• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua教程(十五):输入输出库(I/O库)

Lua教程(十五):输入输出库(I/O库)

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了lua 字符串,lua字符串分割,lua 字符串截取,lua 字符串转换数字,lua 字符串拼接等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

I/O库为文件操作提供了两种不同的模型,简单模型和完整模型。简单模型假设一个当前输入文件和一个当前输出文件,他的I/O操作均作用于这些文件。完整模型则使用显式的文件句柄,并将所有的操作定义为文件句柄上的方法。
    1. 简单模型:
    I/O库会将进程标准输入输出作为其缺省的输入文件和输出文件。我们可以通过io.input(filename)和io.output(filename)这两个函数来改变当前的输入输出文件。
    1). io.write函数:
    函数原型为io.write(...)。该函数将所有参数顺序的写入到当前输出文件中。如:
      io.write("hello","world") --写出的内容为helloworld
    </div>
    2). io.read函数:
    下表给出了该函数参数的定义和功能描述:

  调用io.read("*all")会读取当前输入文件的所有内容,以当前位置作为开始。如果当前位置处于文件的末尾,或者文件为空,那个该调用返回一个空字符串。由于Lua可以高效的处理长字符串,因此在Lua中可以先将数据从文件中完整读出,之后在通过Lua字符串库提供的函数进行各种处理。

    调用io.read("*line")会返回当前文件的下一行,但不包含换行符。当到达文件末尾时,该调用返回nil。如:
   for count = 1,math.huge do
    local line = io.read("*line")  --如果不传参数,缺省值也是"*line"
    if line == nil then
        break
    end
    io.write(string.format("%6d  ",count),line,"\n")
end
 </div>

    如果只是为了迭代文件中的所有行,可以使用io.lines函数,以迭代器的形式访问文件中的每一行数据,如:

local lines = {}
for line in io.lines() do   --通过迭代器访问每一个数据
    lines[#lines + 1] = line
end
table.sort(lines)  --排序,Lua标准库的table库提供的函数。
for _,l in ipairs(lines) do
    io.write(l,"\n")
end
</div>
    调用io.read("*number")会从当前输入文件中读取一个数字。此时read将直接返回一个数字,而不是字符串。"*number"选项会忽略数字前面所有的空格,并且能处理像-3、+5.2这样的数字格式。如果当前读取的数据不是合法的数字,read返回nil。在调用read是可以指定多个选项,函数会根据每个选项参数返回相应的内容。如:

--[[
    6.0  -3.23   1000
    ... ...
    下面的代码读取注释中的数字
--]]
while true do
    local n1,n2,n3 = io.read("*number","*number","*number")
    if not n1 then
        break
    end
    print(math.max(n1,n2,n3))
end
</div>
    调用io.read(<num>)会从输入文件中最多读取n个字符,如果读不到任何字符,返回nil。否则返回读取到的字符串。如:

while true do
    local block = io.read(2^13)
    if not block then
        break
    end
    io.write(block)
end
</div>

io.read(0)是一种特殊的情况,用于检查是否到达了文件的末尾。如果没有到达,返回空字符串,否则nil。

2. 完整I/O模型:

    Lua中完整I/O模型的使用方式非常类似于C运行时库的文件操作函数,它们都是基于文件句柄的。

    1). 通过io.open函数打开指定的文件,并且在参数中给出对该文件的打开模式,其中"r"表示读取,"w"表示覆盖写入,即先删除文件原有的内容,"a"表示追加式写入,"b"表示以二进制的方式打开文件。在成功打开文件后,该函数将返回表示该文件的句柄,后面所有基于该文件的操作,都需要将该句柄作为参数传入。如果打开失败,返回nil。其中错误信息由该函数的第二个参数返回,如:
    assert(io.open(filename,mode))  --如果打开失败,assert将打印第二个参数给出的错误信息。
   
    2). 文件读写函数read/write。这里需要用到冒号语法,如:
 local f = assert(io.open(filename,"r"))
 local t = f:read("*all")  --对于read而言,其参数完全等同于简单模型下read的参数。
 f:close()
</div>

    此外,I/O库还提供了3个预定义的文件句柄,即io.stdin(标准输入)、io.stdout(标准输出)、io.stderr(标准错误输出)。如:
    io.stderr:write("This is an error message.")
    事实上,我们也可以混合使用简单模式和完整模式,如:
 local temp = io.input()   --将当前文件句柄保存
 io.input("newInputfile")  --打开新的输入文件
 io.input():close()        --关闭当前文件
 io.input(temp)            --恢复原来的输入文件
</div>

  3). 性能小技巧:

    由于一次性读取整个文件比逐行读取要快一些,但对于较大的文件,这样并不可行,因此Lua提供了一种折中的方式,即一次读取指定字节数量的数据,如果当前读取中的最后一行不是完整的一行,可通过该方式将该行的剩余部分也一并读入,从而保证本次读取的数据均为整行数据,以便于上层逻辑的处理。如:
    local lines,rest = f:read(BUFSIZE,"*line") --rest变量包含最后一行中没有读取的部分。

    下面是Shell中wc命令的一个简单实现。
local BUFSIZE = 8192
local f = io.input(arg[1])  --打开输入文件
local cc, lc, wc, = 0, 0, 0  --分别计数字符、行和单词   
while true do
    local lines,rest = f:read(BUFSIZE,"*line")
    if not lines then
        break
    end
    if rest then
        lines = lines .. rest .. "\n"
    end
    cc = cc + #lines

您可能想查找下面的文章:

  • 简单的Lua 连接操作mysql数据库的方法
  • Lua编程示例(五): C语言对Lua表的读取和添加
  • Lua编程示例(四):Lua标准库之表库、字符串库、系统库
  • 浅析Lua编程中的异常处理
  • Lua中操作字符串的基本方法整理
  • Lua中的函数相关知识点整理汇总
  • Lua在各个操作系统中的开发环境配置教程
  • Lua中计算、执行字符串中Lua代码的方法
  • Lua教程(十五):输入输出库(I/O库)
  • Lua判断字符串前缀是否为指定字符的3种方法

相关文章

  • Lua中break语句的使用方法详解
  • lua+love2d制作的2048游戏
  • Lua中编译执行代码相关的函数详解
  • 实现Lua中数据类型的源码分享
  • 浅谈Lua的面向对象特性
  • Lua编程中使用嵌套循环的使用教程
  • Lua内置的调试器用法详解
  • 获取Lua表结构(table)数据实例
  • Lua中类的实现原理探讨(Lua中实现类的方法)
  • Lua编程示例(六): C语言调用Lua函数

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua中的__index方法详解
    • Lua脚本语言简明入门教程
    • Lua中关于元方法的一些知识点小结
    • C语言中通过LUA API访问LUA脚本变量的简单例子
    • Lua教程(十六):系统库(os库)
    • Lua文件读写详解
    • Lua函数用法研究
    • C++中调用Lua配置文件和响应函数示例
    • Lua中获取table长度问题探讨
    • Lua中的metatable介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有