Lua 使用 —— IO 操作_lua io-程序员宅基地

技术标签: c++  c语言  android  Lua  lua  开发语言  

一、前言

Lua 语言是以一个脚本存在,所以他自身不会提供太多和外部交互的机制。需要交互则由宿主提供或是由外部库。

接下来分享下如何使用以 iso c 作为宿主,进行标准库的 io 操作。

二、io.input、io.output

1、io.input

io.input(filename) 会以只读模式打开指定文件,并将文件设置为当前输入流。后续的输入都将来自该文件,除非重新调用 io.input

2、io.ouput

io.ouput(filename) 会以只写模式打开指定文件,并将文件设置为当前输出流。后续的输出都会给到该文件,除非重新调用 io.ouput

3、io.input 和 io.output 影响

io.inputio.output 的设置会改变当前的输入输出流

image.png

二、io.write

读取任意数量的字符串或者数字,将内容写入当前输出流

性能优化点

如果需要写入多个参数,应该使用 io.write 多参数传参,而不要自行拼凑,下面的代码是等价的

-- 这样性能好,避免不必要的连接动作
io.write("jiang", "peng", "yong")       --> jiangpengyong

-- 浪费资源效率低
io.write("jiang" .. "peng" .. "yong")   --> jiangpengyong

格式化

在输出中,一样可以使用 string.format 进行格式化,只要写入最终结果合法即可。

io.write("sin(3) = ", math.sin(3), "\n")
-- 如果需要格式化,则需要调用 string.format
io.write(string.format("sin(3) = %.4f", math.sin(3)), "\n")

print 和 io.wirte 区别

两者都可以做到输出到控制台的作用。

print:

  • 会在最终输出结果中添加诸如制表符或换行符的额外内容
  • 只能使用标准输出
  • 会为参数自动调用 tostring ,可能会带来一些奇怪的 bug

io.write

  • 输出很纯粹,没有添加任何内容
  • 允许对输出进行重定向

如果只是调试,使用 print 会方便很多

三、io.read

从当前输入流读取内容,io.read("mode") mode 可选参数,read 都是针对当前流当前位置(可以通过下面的例子体会)。

符号 描述
“a” 读取整个文件
“l” 读取下一行(丢弃换行符) (默认参数)
“L” 读取下一行(保留换行符)
“n” 读取一个数值,如果下一个可读的内容不是数值,则会获取到 nil
num 以字符串读取 num 个字符
io.input(rootPath .. "一件小事.txt")
print(io.read("l"))             -- 读取一行的内容,内容太多,自行运行程序
article = io.read("a")          -- 会接着上一个读取的位置,继续往下读,将全文读取完
print(article)

Lua 对长字符串处理很高效,所以可以考虑将整个文件读取出来后,进行处理。当然内存的消耗是不可避免的。

article = io.read("a")
change = string.gsub(article, "我", "*")
print(change)

如果已经到输入流末尾,进行读取,除了 " a " 读取为 空字符串,其他都返回 nil

print("io.read(\"a\"): ", io.read("a"))     --> io.read("a"): 	(空字符串)
print("io.read(\"l\"): ", io.read("l"))     --> io.read("l"): 	nil
print("io.read(\"L\"): ", io.read("L"))     --> io.read("L"): 	nil
print("io.read(\"n\"): ", io.read("n"))     --> io.read("n"): 	nil
print("io.read(9): ", io.read(9))           --> io.read(9): 	nil

1、遍历输入流方式

1-1、可以通过 io.read 返回 nil 进行判断
io.input(rootPath .. "一件小事.txt")
io.output(rootPath .. "一件小事-copyByReadLine")
for count = 1, math.huge do
    local line = io.read("L")
    if line == nil then
        break
    end
    io.write(string.format("%6d  ", count), line)
end

image-2.png

1-2、可以通过 io.lines 进行

io.lines(filename, ...) 返回一个从流中不断读内容的迭代器。

io.lines(filename, …) 相当于 file:lines(…) 。 即后面的可边参数是给到文件使用的,具体这种写法在后续的文章会进行分享,先有一个印象。

可以不传递文件名,此时则相当于使用当前的文件流,并且操作完之后不会自动关闭流。

io.input(rootPath .. "一件小事.txt"
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_37625173/article/details/132136711

智能推荐

yum安装及配置_安装yum-程序员宅基地

文章浏览阅读10w+次,点赞40次,收藏332次。yum是用来管理rpm的,就跟maven管理jar包相似。yum源(库)分为本地库、网络库。首先要配置yum源,可支持多个源。先查看一下挂载情况:df -h这里我们要更换光盘,并挂载:mount /dev/cdrom /mnt(如果不能成功挂载,点击一下连接即可)之后再次使用 df -h命令,就能查看到光盘的内容。下面我们cd到 /mnt下查看一下:首先关注一下Pa..._安装yum

关于STM32 CAN的过滤器/滤波器_stm32can mailbox filter-程序员宅基地

文章浏览阅读3.8k次,点赞5次,收藏12次。1.在设置CanTxMsg.StdId时注意需要将其右移一位,比如如下滤波器配置:CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_Filter..._stm32can mailbox filter

HDU 5119 Happy Matt Friends(动态规划)【状压基础类模板】_matt has n friends. they are playing a game togeth-程序员宅基地

文章浏览阅读373次。att has N friends. They are playing a game together. Each of Matt’s friends has a magic number. In the game, Matt selects some (could be zero) of his friends. If the xor (exclusive-or) sum of the selected friends’magic numbers is no less than M , Matt wi_matt has n friends. they are playing a game together.

vue3+vite+ts项目配置开发环境和生产环境 打包命令配置_vite打包配置-程序员宅基地

文章浏览阅读8.4k次,点赞6次,收藏29次。开发环境和生产环境的配置和打包方式有所不同,下面是基于vue3+vite+ts项目的开发环境和生产环境配置及打包方式的详细说明。打包完成后会在项目根目录下生成dist目录,里面包含了打包后的静态文件和index.html文件,可以直接部署到服务器上。这里配置了三个命令,分别是开发环境启动命令、开发环境打包命令和生产环境打包命令。1.3 配置.env.development。2.2 配置.env.production。1.2 配置vite.config.ts。2.1 配置vite.config.ts。_vite打包配置

(最新最详细)安装ubuntu18.04-程序员宅基地

文章浏览阅读2w次,点赞4次,收藏91次。目录1. window10中下载ubuntu镜像2. 制作U盘启动盘3. Ubuntu 分配硬盘空间1. window10中下载ubuntu镜像下载地址2. 制作U盘启动盘安装制作工具:UltraISO(点我下载),下载完成后安装插入用来做启动盘的U盘(最好是usb3.0接口,16GB或以上),并清空里面的文件打开安装好的UltraISO,点击继续试用按钮工作界面进入工作界面后,点击菜单栏文件(F),在弹出的选项卡里点击打开在弹出的文件选择对话框中找到下载好的 Ubuntu18.04._ubuntu18.04

Toad报“No valid Oracle Client found”错-程序员宅基地

文章浏览阅读203次。2019独角兽企业重金招聘Python工程师标准>>> ..._toad no valid oracle client

随便推点

分布式系列教程(11) -分布式协调工具Zookeeper(分布式锁实现)_分布式锁 的具体实现工具-程序员宅基地

文章浏览阅读553次,点赞2次,收藏2次。代码已提交至Github,有兴趣的同学可以下载来看看(git版本号:bea4d6f7ec9f7309033bcfa43316a660171ae5b6):https://github.com/ylw-github/Zookeeper-Demo本文目录结构:l____1. 知识点回顾l________1.1 多线程l________1.2 Java共享内存模型l____2. 分布式锁的解决方..._分布式锁 的具体实现工具

Nginx网站服务详解(Nginx服务的主配置文件 ——nginx.conf)-程序员宅基地

文章浏览阅读9.3k次,点赞9次,收藏51次。Nginx网站服务详解,Nginx服务的主配置文件,修改,监听,配置,密码认证,以及IP和端口虚拟主机配置方法,含图文步骤拆解讲解_nginx.conf

Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级_3.轻量级锁-程序员宅基地

文章浏览阅读10w+次,点赞266次,收藏1.1k次。目录一、Synchronized使用场景二、Synchronized实现原理三、锁的优化1、锁升级2、锁粗化3、锁消除一、Synchronized使用场景Synchronized是一个同步关键字,在某些多线程场景下,如果不进行同步会导致数据不安全,而Synchronized关键字就是用于代码同步。什么情况下会数据不安全呢,要满足两个条件:一是数据共享(临界资源),二..._3.轻量级锁

排序算法-堆积树排序法(HeapSort)-程序员宅基地

文章浏览阅读731次。堆积树排序法是选择排序法的改进版,可以减少在选择排序法中的比较次数,进而减少排序时间。堆积排序法用到了二叉树的技巧,是利用堆积树来完成排序的。堆积树是一种特殊的二叉树,可分为最大堆积树和最小堆积树两种。

Hadoop调优第一篇_hadoop_namenode_opts-程序员宅基地

文章浏览阅读917次。1.hdfs核心参数——回收站设置第一步,在调优前我们需要对namenode与datanode的内存配置进行参数化设置。通过hadoop-env.sh查看namenode与datdanode的具体参数。相关参数设置如下export HDFS_NAMENODE_OPTS=”-Dhadoop.security.logger=INFO,RFAS -Xmx1024m”export HDFS_DATANODE_OPTS=”-Dhadoop.security.logger=ERROR,RFAS -Xmx10_hadoop_namenode_opts

Studio 3T for MongoDB 激活破解脚本_studio 3tjihuoma-程序员宅基地

文章浏览阅读1.9w次,点赞2次,收藏27次。Studio 3T试用期过了不能使用,网上未搜索到相对应的激活码,可以选择重置使用时间继续使用。_studio 3tjihuoma

推荐文章

热门文章

相关标签