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

智能推荐

linux查看端口命令_liunx中如何查端口号命令-程序员宅基地

文章浏览阅读1.4k次。netstat -an|grep 80 查看80端口进程列表_liunx中如何查端口号命令

jmeter学习记录(1)接口之间的动态关联--同一个线程组_jmeter中线程组session一致-程序员宅基地

文章浏览阅读699次。多个http请求处于同一个线程组内,可以通过正则表达式提取数据(必要时需要用v函数拼接),然后直接引用变量到下一个接口即可一、业务场景:测试过程中,有时下一个接口需要用到上一个接口的参数,我们要按照业务逻辑进行动态关联。做接口测试时候,尤其碰到某个接口需要用到上一个接口的数据,那我们就需要用到提取器来提取我们需要的数据,然后为下一个接口所用,其实就是在动态关联的时候需要用到。我最近在做接口测试过程中,正好用到了正则表达式提取数据和使用v函数拼接后,在下个接口中引用变量的场景,把整个过程记录下来,免得_jmeter中线程组session一致

libcurl 的 curl_easy_setopt()_curlopt_ssl_verifypeer-程序员宅基地

文章浏览阅读836次。CURL *hCurl = curl_easy_init();curl_easy_setopt(hCurl, CURLOPT_SSL_VERIFYPEER, 1L);curl_easy_setopt(hCurl, CURLOPT_SSL_VERIFYHOST, 2L);1、HTTPS相关(1)CURL_VERIFY_PEER默认值为1,该参数表示是否验证HTTPS证书的合法性,就是用第三方证书机构颁发的CA数字证书来解密服务端返回的证书,来验证其合法性。可在编译时就将CA数字证书编译进去,._curlopt_ssl_verifypeer

机器视觉工业缺陷检测的那些事(一、光源)_1.单选题对于表面不反光物体,采用下列哪种入射角度的光源比较好a高角度照射b-程序员宅基地

文章浏览阅读1.4w次,点赞48次,收藏324次。机器视觉工业缺陷检测的那些事(一) 视觉工业检测大体分为工件尺寸测量与定位,和表面缺陷检测,及各种Logo标识的检测与识别等。尺寸测量主要是检测物体的长、宽、高,比较常见主要是物体的二维尺寸(宽和高)检测。表面缺陷检测主要是物体表面局部物理或者化学性质不均匀的区域,比较常见的有金属或者塑料制品表面的划痕(如:手机壳/屏幕表面的划痕)、斑点和孔洞(如:PCB板漏了焊点或者表面多了焊点),纸张表面的色差、脏污点、破损,纸制品表面的压痕、凸起,玻璃等非金属制品表面的杂质、破损、污点、平整度等..._1.单选题对于表面不反光物体,采用下列哪种入射角度的光源比较好a高角度照射b

AO4621-VB一款N+P—Channel沟道SOP8的MOSFET晶体管参数介绍与应用说明-程序员宅基地

文章浏览阅读123次,点赞4次,收藏2次。在不同的栅极-源极电压下,低RDS(ON)值分别为28mΩ和51mΩ,确保高效的功率管理。利用其高电压额定值、电流承载能力和低导通电阻,AO4621-VB为不同行业和应用提供了一种多功能的功率管理解决方案。4. 电池管理:在电动车辆、太阳能系统和便携设备等电池管理系统中,AO4621-VB可以处理高电流并提供可靠性能。1. 电机控制:AO4621-VB可用于电器、机器人和工业机械等电机控制电路,具有高电流承载能力和低导通电阻。5. 音频放大器:可用于音箱和耳机等音频放大电路,确保低失真和高保真音频输出。

北斗GPS车辆监控管理系统_北斗设备管理字段-程序员宅基地

文章浏览阅读335次。监控中心是在整个系统的“神经中枢”,集中实现监控、调度、接/处警,图像处理功能和其他信息服务,并对整个系统的软硬件进行协调、管理。●防盗报警:设备提供和原车防盗器对接的自定义检测线束,防盗器发出盗,报警数据上传到中心。●(可选)自定义报警:由用户根据需要连接各种检测开关,触发报警,例如防盗器报警。●自定义报警:支持1-2路自定义报警,如卸料是报警,车辆要接检测开关;●自定义报警:支持1-2路自定义报警,如卸料是报警,车辆要接检测开关;●紧急报警:驾驶员危险时按报警开关报警,中心必须人工干预才能取消;_北斗设备管理字段

随便推点

SynchronizedMap和ConcurrentHashMap有什么区别-程序员宅基地

文章浏览阅读734次。SynchronizedMap实现上在调用Map的所有方法是,对整个map进行了同步!public V put(K key, V value) { synchronized (mutex) {return m.put(key, value);}}ConcurrentHashMap的实现却更加精细,他对要操作的桶加锁,而不是整个加锁,所以ConcurrentHashMap在性能..._sequencedhashmap 和 concurrenthashmap 区别是什么

二、SpringBoot2核心功能--04单元测试--01-JUnit5单元测试及其注解-程序员宅基地

文章浏览阅读815次,点赞14次,收藏30次。JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。@Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试。: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎。: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。

signature=f326654ec2c650c08589c4b3d37549aa,Squashed commit of the following:-程序员宅基地

文章浏览阅读4.1k次。commit 06145230c833c3db5dab8858e11bcd550a37c57fAuthor: Nick Coghlan Date: Thu Aug 29 23:26:53 2019 +1000bpo-37947: Avoid double-decrement in symtable recursion counting (GH-15593)With `symtable_visi..._squashed commit of the following:

Oracle 分析函数over,列转行函数pivot理解及综合运用(报表中的小计和合计)_oracle转置函数pivot-程序员宅基地

文章浏览阅读3.1k次。Oracle合计,根据列值条件进行多条件统计。_oracle转置函数pivot

跨域资源共享CORS漏洞_cors漏洞利用-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏26次。0x01 漏洞简介跨域资源共享(CORS)是一种放宽同源策略的机制,它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制,以使不同的网站可以跨域获取数据,目前已经被绝大多数浏览器支持,并被主流网站广泛部署使用。跨域资源共享 CORS 漏洞主要是由于程序员配置不当,对于 Origin 源校验不严格,从而造成跨域问题,攻击者可以利用 CORS 错误配置漏洞,从恶意网站跨域读取受害网站的敏感信息。这里只做简单介绍,关于 CORS 漏洞的详细分析可以点击_cors漏洞利用

hdu 4512 吉哥系列故事——完美队形I(最长上升公共子序列)-程序员宅基地

文章浏览阅读609次。题意:给出n个人的身高,求这些人中连续的且满足对称、从做到中心递增的最大人数。题解:很明显,想到将序列倒序,然后两个串进行匹配最大上升公共子序列注意两点:一、像这样的23232 最长是3个人,所以匹配的二维循环中j最大不能超过n-i+1;二、要单独判断奇数偶数的匹配,否则奇数匹配结果会多1;#include#include#include#include#inc

推荐文章

热门文章

相关标签