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

智能推荐

推荐 :利用Auto ARIMA构建高性能时间序列模型(附Python和R代码)-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏25次。作者:AISHWARYA SINGH;翻译:陈之炎;校对:丁楠雅本文共3400字,建议阅读10+分钟。本文介绍了ARIMA的概念,并带你用Python和R训练一个数据集实..._python中auto-arima

TCP三次握手与四次挥手_tcp的3次握手和4次挥手-程序员宅基地

文章浏览阅读1.4k次。Tcp三次握手与四次挥手,自己的见解_tcp的3次握手和4次挥手

自然语言处理核心期刊_中国中文信息学会-程序员宅基地

文章浏览阅读467次。全国第十六届计算语言学会议(CCL 2017)及第五届基于自然标注大数据的自然语言处理国际学术研讨会(NLP-NABD 2017)联合征稿启事2017-03-20“第十六届全国计算语言学学术会议”(The Sixteenth China National Conference on Computational Linguistics, CCL 2017)将于2017年10月13日—15日在南京师范..._ccl是中文核心吗

html中的li标签不换行,css li 不换行(布局,内容)-程序员宅基地

文章浏览阅读3k次。参考这里------不换行的策略:不换行原理:ul 和 li 默认都是 display:block; 的标签,可以通过2种方式实现 li 的 不换行显示:* 将 li 设为 display:inline; ,然后通过 marging 和 padding 设置 li 的间距,* 将 li 设为 float:left; ,然后通过 ( margin & padding ) 设置 li 的间距,...

强大的虚拟音频器:Loopback for Mac_音频虚拟器作用-程序员宅基地

文章浏览阅读1.5k次。loopback mac 激活版是mac上一款强大的虚拟音频器,可以帮助您创建聚合来自多个源(如麦克风或各种应用程序)的输入的虚拟设备,然后可以将其设置为其他应用程序中的默认输入设备。每个设备都可以配置为从任何应用程序或输入源绘制音频,甚至可以实时监视输出。而且通道映射是自动执行的,但您也可以通过将项目从音频源表拖动到通道映射表来手动配置虚拟设备。原文链接:https://mac.orsoon.com/Mac/164753.html(附安装下载教程)适用于MAC的无线音频路由突然间,在Mac上的应_音频虚拟器作用

随便推点

Android中轮播图的实现_安卓轮播图-程序员宅基地

文章浏览阅读502次。—————–纯粹图片的轮播图——————–导包 //banner广告轮播图 compile 'com.youth.banner:banner:1.4.9'布局中使用

北京口袋时尚科技公司-微店内推技术一面-程序员宅基地

文章浏览阅读185次。今天下午预约的面试,如期到来,回顾一下面试的过程.1.简单的自我介绍2.开始面试(看简历问),一面一般是压力面试,我简历上写的可以开发手机游戏(Cocos2d-x),他就问知道Dijkstra算法吗,面试时面试官说他电话有问题(确实信号不信),但面试官很nice,我一时没听清,就说不知道,以前写过单源最短路径的题。3.看了我研究过安全与劫持,他就问内核态和用户态的转化过程,感觉答的不是..._北京口袋时尚科技有限公司的微店

2020年末知识大总结:Java程序员转Android开发必读经验一份,嵌入式开发入门教程_软件开发转移动端开发需要学什么-程序员宅基地

文章浏览阅读815次。Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择。学安卓从事移动互联方向开发,学Java从事软件、网站开发。而安卓上的应用大多是Java编写的,所以建议在安卓前期的Java学习阶段中,要用心学好。言简意赅的说说“转”前的准备:其实Java程序员要自学安卓开发的基础知识还是没有什么难度的,毕竟语言相通,特性相似, 阅读安卓源代码的门槛以比较低一些,作为能够考虑“转”的合格的程序员的你,自学能力和相关的基础知识应该不是问题,学习安卓也相对比较轻松._软件开发转移动端开发需要学什么

Stm32CubeIDE设置补全快捷键和主题_cubeide快捷键设置-程序员宅基地

文章浏览阅读8.2k次,点赞8次,收藏32次。Stm32CubeIDE设置补全快捷键和主题stm32CubeIde的设置,省的自己忘记了。一、主题设置提示:这里可以添加要学的内容例如:1、 help->Eclipse Market->输入"Devstyle"查找主题插件->install安装2、窗口->首选项 找到主题3、按照如下设置完成后会提示重启,重启后效果如下所示二、补全设置用于设置代码的自动补全搜索: key->content assist默认的补全快捷键时alt+/,这里我改成双击两次_cubeide快捷键设置

【QBKbupt】洛谷P2525Uim的情人节礼物·其之壱-程序员宅基地

文章浏览阅读142次。(题目链接:https://www.luogu.com.cn/problem/P2525)#include<bits/stdc++.h>using namespace std;int main(){ int tmp,pos,s,n,number,symbol=1,input[10],data[10],memory[10]; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&input[i]);

CSS入门|空余空间、换行和省略-程序员宅基地

文章浏览阅读241次,点赞3次,收藏7次。text-overflow:ellipsis(省略号);(如果用clip(裁剪),就没有三个点)nowrap 文本不换行,直到遇到标签【最常用】pre 预格式化文本-保留空格,tab,回车。pre-line 显示回车,不显示换行,空格。做出多的文本省略、显示三个点的效果——容器宽度:width:200px;White-space空余空间。pre-wrap 自然换行。

推荐文章

热门文章

相关标签