Lua语言的文件IO

        1、我们都知道,在任何语言当中都有输入输出,比如c语言当中就有很多printf,scanf,get ,put,gets,puts,文件io:open,read,write,close,标准io:fopen,fread,fwrite,fclose.在lua语言当中,也有相同的一些输入输出特性,叫io.open,io.read,io.write,io.close,这类似的输入输出函数。

        两者相似但是有一些区别,那么下面我们就来对比学习。

官方参考手册原话:

I/O 库提供了两套不同风格的文件处理接口。 第一种风格使用隐式的文件句柄; 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件。 第二种风格使用显式的文件句柄。

当使用隐式文件句柄时, 所有的操作都由表 io 提供。 若使用显式文件句柄, io.open 会返回一个文件句柄,且所有的操作都由该文件句柄的方法来提供。

表 io 中也提供了三个 和 C 中含义相同的预定义文件句柄: io.stdin, io.stdout, 以及 io.stderr。 I/O 库永远不会关闭这些文件。

        两者的权限参数基本相同。只不过在lua语言当中更加简洁

模式C 语言 (fopen)Lua (io.open)描述
r"r""r"只读模式打开文件。文件必须存在,否则会失败。
w"w""w"只写模式打开文件。如果文件存在,内容会被清空;如果文件不存在,会创建。
a"a""a"追加模式打开文件。如果文件存在,写入内容会追加到文件末尾;如果文件不存在,会创建。
r+"r+""r+"读写模式打开文件。文件必须存在,否则会失败。
w+"w+""w+"读写模式打开文件。如果文件存在,内容会被清空;如果文件不存在,会创建。
a+"a+""a+"读写模式打开文件。如果文件存在,写入内容会追加到文件末尾;如果文件不存在,会创建。

1、fopen()和io.open()

        c语言当中的fopen是标准io,返回值是file*指针,是一个文件指针类型

FILE *file = fopen("test.txt", "r");
if (file == NULL) {printf("Failed to open file.\n");
}

        lua语言当中io.open,返回值是userdata类型,是一个文件对象

local file = io.open("test.txt", "r")
if not file thenprint("Failed to open file.")
end

2、scanf()和io.read()

        在c语言当中,一般使用scanf来获取文件信息

char buffer[100];
int n;
scan("%d",&n);
printf("%d", n);

        在lua语言当中,一般使用io.read()来读取终端的输入信息

local n=io.read()
io.write("n="..n.."\n")

3、fprintf()和io.write()

        在c语言标准io中,使用fprintf()来输出信息

fprintf(file, "Hello, C!\n");

        在lua语言中,使用io.write()来输出信息

io.write("hello! lua")

4、fclose()和close()

        在c语言标准io当中,使用fclose来关闭一个已经打开的文件,参数是文件

fclose(file);

        在lua语言当中,使用close来关闭一个已经打开的文件,参数是文件对象

file:close()

上面我说到c语言当中的文件io和标准io,那么在lua当中有没有标准和文件之分呢?

其实是有的。

write和io.write的区别

特性file:write()io.write()
数据目标向已打开的文件对象中写入数据。向标准输出(通常是控制台)写入数据。
使用场景用于文件操作。用于控制台输出或标准输出流操作。
是否需要打开文件需要先通过 io.open 打开文件。不需要打开文件,直接写入到标准输出。
返回值返回文件对象本身(支持链式调用)。返回 io 对象本身(支持链式调用)。
常用场景写入文件内容。打印调试信息或输出到控制台。

         其实在lua当中使用io.read和c里面使用scanf差不多,如果是普通的read,是对文件进行操作的,必须要先打开一个文件,这样才能进行读和写的操作。

特性file:read("*a")io.read()
数据来源从已打开的文件对象中读取数据。从标准输入(通常是控制台)读取数据。
使用场景用于文件操作。用于用户输入或标准输入流操作。
模式参数支持 "*a"(读取整个文件)等模式。支持 "*a"(读取所有输入)等模式。
返回值返回文件内容(字符串)。返回用户输入内容(字符串或数字等)。
是否需要打开文件需要先通过 io.open 打开文件。不需要打开文件,直接从标准输入读取。

 举例练习:

1、下面是一个修改键的值的代码,请问修改之后,表的顺序改变了吗?

local t = {1,2,3,key="value"}print(t[1],t["key"])
--修改键
--方法如下
local old=1
local new=10
local value=t[old]
t[old]=nil
t[new]=value
print(t[10],t["key"])

表的顺序已经发生了改变,为什么呢,由于lua表是哈希表存储的,键 1 被删除,键 10 被添加,存储位置和遍历顺序发生了变化。

如果做一个遍历查询会比较直观,

local t = {1, 2, 3, key = "value"}-- 第一次遍历
print("Before modification:")
for k, v in pairs(t) doprint(k, v)
end-- 修改键
local old = 1
local new = 10
local value = t[old]
t[old] = nil
t[new] = value-- 第二次遍历
print("After modification:")
for k, v in pairs(t) doprint(k, v)
end

输出结果如下

Before modification:
1       1
2       2
3       3
key     valueAfter modification:
2       2
3       3
10      1
key     value

可以发现,这时候发现表中的数据顺序已经发生了改变

2、下面的代码输出什么

local x=15
if x > 10 thenprint(x..">"..10)
elseif x < 10 thenprint(x.."<".."10")
elseif x > 5 thenprint(x..">".."5")
elseprint("x<5")
end

输出: 

15>10

 这里是一个条件分支结构,只会选择一条支路执行

3,下面的代码输出什么

--第三题
local function add(a,b)return a+b
end
print(add(3,4))

输出7,这个没什么说的

4、下面的代码输出什么

--four
local s="hello! lua"
print(string.sub(s,1,5))

输出hello

5、下面的输出是什么

--five
local m={1,2,3,4}
m[#m+1]=4
print(#m,m[4])

输出5,4

6、下面输出的是什么

--six
local t = {10, 20, 30}
for i, v in ipairs(t) doprint(i, v)
end

输出10 1 ,20 2,30 3.

7、下面代码输出什么

local t1 = {1, 2, 3}
local t2 = {4, 5, 6}
setmetatable(t1, {__add = function(a, b)local result = {}for i, v in ipairs(a) dotable.insert(result, v + b[i])endreturn result
end})
local t3 = t1 + t2
print(table.concat(t3, ", "))

输出5,7,9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/67843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【css】浏览器强制设置元素状态(hover|focus……)

直接上步骤&#xff1a; 打开浏览器控制台 → 找到样式选项 → 找到:hov选项 → 点击:hov选项&#xff0c;会展开【设置元素状态】。 只要选中就会展示出自己写在css里面的该种状态下的样式了。

LabVIEW水轮发电机组振动摆度故障诊断

本文介绍了基于LabVIEW的水轮发电机组振动摆度故障诊断系统的设计与实施过程。系统在通过高效的故障诊断功能&#xff0c;实现水轮发电机组的振动、温度等关键指标的实时监控与智能分析&#xff0c;从而提高电力设备的可靠性和安全性。 ​ 项目背景 随着电力行业对设备稳定性…

pytorch模型的保存失敗しましたが、

目录 简洁&#xff1a; 评估模式 后缀 区别 保存模型&#xff08;整个模型&#xff09; 加载过程: 保存状态字典 加载过程: 总结 把模型训练到一半保存&#xff0c;想下次接着训练&#xff0c;用那种保存方式 保存模型和优化器状态字典 加载模型和优化器状态字典 如…

风水算命系统架构与功能分析

系统架构 服务端&#xff1a;Java&#xff08;最低JDK1.8&#xff0c;支持JDK11以及JDK17&#xff09;数据库&#xff1a;MySQL数据库&#xff08;标配5.7版本&#xff0c;支持MySQL8&#xff09;ORM框架&#xff1a;Mybatis&#xff08;集成通用tk-mapper&#xff0c;支持myb…

Unity + Firebase + GoogleSignIn 导入问题

我目前使用 Unity版本&#xff1a;2021.3.33f1 JDK版本为&#xff1a;1.8 Gradle 版本为&#xff1a;6.1.1 Firebase 版本: 9.6.0 Google Sign In 版本为&#xff1a; 1.0.1 问题1 &#xff1a;手机点击登录报错 apk转化成zip&#xff0c;解压&#xff0c;看到/lib/armeabi-v…

微信原生小程序自定义封装组件(以导航navbar为例)

封装 topnav.js const App getApp(); Component({// 组件的属性列表properties: {pageName: String, //中间的titleshowNav: { //判断是否显示左上角的按钮 type: Boolean,value: true},showHome: { //判断是否显示左上角的home按钮type: Boolean,value: true},showLocat…

鸿蒙面试 2025-01-10

写了鉴权工具&#xff0c;你在项目中申请了那些权限&#xff1f;&#xff08;常用权限&#xff09; 位置权限 &#xff1a; ohos.permission.LOCATION_IN_BACKGROUND&#xff1a;允许应用在后台访问位置信息。 ohos.permission.LOCATION&#xff1a;允许应用访问精确的位置信息…

使用大数据分析提升电子商务的转化率

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

【Rust自学】11.4. 用should_panic检查恐慌

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.4.1. 验证错误处理的情况 测试函数出了验证代码的返回值是否正确&#xff0c;还需要验证代码是否如预期的去处理了发生错误的情况。比…

MATLAB画柱状图

一、代码 clear; clc; figure(position,[150,100,900,550])%确定图片的位置和大小&#xff0c;[x y width height] %准备数据 Y1[0.53,7.9,8.3;0.52,6.8,9.2;0.52,5.9,8.6;2.8,5.8,7.9;3.9,5.2,7.8;1.8,5.8,8.4]; % withoutNHC X11:6; %画出4组柱状图&#xff0c;宽度1 h1…

STM32 I2C硬件配置库函数

单片机学习&#xff01; 目录 前言 一、I2C_DeInit函数 二、I2C_Init函数 三、I2C_StructInit函数 四、I2C_Cmd函数 五、I2C_GenerateSTART函数 六、I2C_GenerateSTOP函数 七、I2C_AcknowledgeConfig函数 八、I2C_SendData函数 九、I2C_ReceiveData函数 十、I2C_Sen…

MT6835天玑6100平台规格参数_MTK联发科安卓核心板方案定制开发

联发科MT6835平台集成了蓝牙、FM、WLAN 和 GPS 模块&#xff0c;是一个高度集成的基带平台。该芯片集成了两个 Arm Cortex-A76 内核&#xff08;运行频率高达 2.2GHz&#xff09;、六个 Arm Cortex-A55 内核&#xff08;运行频率高达 2.0 GHz&#xff09;和强大的多标准视频编解…

【微服务与K8S】

微服务核心概念 配置中心 定义&#xff1a;集中管理微服务配置的组件。作用&#xff1a;微服务数量多&#xff0c;配置复杂&#xff0c;配置中心让配置集中化&#xff0c;便于管理与修改。支持动态更新配置&#xff0c;无需重启服务&#xff0c;提升运维效率与灵活性。如开发、…

记录一个移动端表格布局,就是一行标题,下面一列是对应的数据,一条一条的数据,还有点击数据进入详情的图标,还可以给一列加input输入框,还可以一对多

注&#xff1a;以下字段名都是随手写&#xff0c;并不规范&#xff0c;自己替换自己的&#xff0c;&#xff0c;只参考样式 注&#xff1a;以下重要的是布局&#xff0c;样式&#xff0c;宽高什么的再自己去搞吧 <view class"search"> <u-…

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年&#xff0c;大模型技术已经普及并逐步渗透到各行各业&#xff0c;2025年注定是大模型应用井喷式发展的一年&#xff0c;AI在快速发展的同时&#xff0c;其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载&#xff1a;600多…

ELK日志分析实战宝典之ElasticSearch从入门到服务器部署与应用

目录 ELK工作原理展示图 一、ElasticSearch介绍&#xff08;数据搜索和分析&#xff09; 1.1、特点 1.2、数据组织方式 1.3、特点和优势 1.3.1、分布式架构 1.3.2、强大的搜索功能 1.3.3、数据处理与分析 1.3.4、多数据类型支持 1.3.5、易用性与生态系统 1.3.6、高性…

【老白学 Java】项目演练 - Quizzes #2

项目演练 - Quizzes #2 文章来源&#xff1a;《Head First Java》修炼感悟。 上一篇文章老白仔细分析了 Quizzes 的类结构&#xff0c;本文接上一章继续对功能模块逐步完善。 整个程序没有复杂的算法&#xff0c;仅仅用到了一些基础知识&#xff0c;如果大家已经了解了这部分内…

计算机网络 (33)传输控制协议TCP概述

一、定义与基本概念 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它工作在OSI模型的第四层&#xff0c;即传输层&#xff0c;为用户提供可靠的、有序的和无差错的数据传输服务。TCP协议与UDP协议是传输层的两大主要协议&#xff0c;但两者在设计上有明显的不同&…

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年&#xff0c;是 JuiceFS 开源版本推出的第 4 年&#xff0c;企业版的第 8 个年头。回顾过去这一年&#xff0c;JuiceFS 社区版依旧保持着快速成长的势头&#xff0c;GitHub 星标突破 11.1K&#xff0c;各项使用指标增长均超过 100%&#xff0c;其中文件系统总…

4、SDH为基础的多业务传送-MSTP

1、SDH&#xff08;Synchronous Digital Hierarchy&#xff0c;同步数字体系&#xff09; SDH 就像是一条超级高速公路&#xff0c;它的规则很严格&#xff0c;所有的车辆&#xff08;数据信号&#xff09;都要按照它规定的速度和车道&#xff08;标准的传输体制&#xff09;行…