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
相关文章:
Lua语言的文件IO
1、我们都知道,在任何语言当中都有输入输出,比如c语言当中就有很多printf,scanf,get ,put,gets,puts,文件io:open,read,write,close,标准io:fopen,fread,fwrite,fclose.在lua语言当中,也有相同的一些输入输出特性,叫io.open,io.re…...
C语言基本知识复习浓缩版:输出函数printf
输出函数printf学习 printf()的作用是将文本输出到屏幕上使用之前需要先引入stdio.h头文件printf函数在使用的时候,至少需要一个参数 printf() 是 C 语言标准库中的一个函数,用于将格式化的文本输出到标准输出设备(通常是屏幕)。…...

Ubuntu中使用miniconda安装R和R包devtools
安装devtools环境包 sudo apt-get install gfortran -y sudo apt-get install build-essential -y sudo apt-get install libxt-dev -y sudo apt-get install libcurl4-openssl-dev -y sudo apt-get install libxml2.6-dev -y sudo apt-get install libssl-dev -y sudo apt-g…...

Jmeter-压测时接口如何按照顺序执行
Jmeter-压测时接口如何按照顺序执行-临界部分控制器 在进行压力测试时,需要按照顺序进行压测,比如按照接口1、接口2、接口3、接口4 进行执行 查询结果是很混乱的,如果请求次数少,可能会按照顺序执行,但是随着次数增加…...

Ungoogled Chromium127 编译指南 MacOS篇(七)- 安装依赖包
1. 引言 在获取了 Ungoogled Chromium 的源代码之后,我们需要安装所有必要的依赖包。这些依赖包对于成功编译 Chromium 至关重要。本文将指导您完成所有必需软件包的安装。 2. 依赖包安装 2.1 使用 Homebrew 安装基础依赖 # 安装 Ninja 构建系统 brew install n…...
批量写入数据到数据库,卡顿怎么解决
在批量写入数据到数据库时,遇到卡顿或性能瓶颈是比较常见的问题。以下是一些可能的解决方案和优化策略,帮助你提高批量写入的性能: ### 1. **批量大小优化** - **调整批量大小**:尝试调整批量写入的数据量,找到一个平衡点。过大或过小的批量大小都可能影响性能。通常,批…...

Python爬虫 - 豆瓣图书数据爬取、处理与存储
文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的单个图书信息1.2 爬取步骤1.2.1 爬取豆瓣图书标签分类页面1.2.2 爬取分类页面1.2.3 爬取单个图书页面 1.3 内容所在的标签定位 2. 数据用途2.1 基础分析2.2 高级分析 3. 应对反爬机制的策略3.1 使用 …...

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)
文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后,除了用户做的界面,最上面还有一个框,这就是window frame框。对于界面的元素,它们的原点是Qt界面的左上角或win…...
在vue3项目中利用自定义ref实现防抖
一,效果展示 自定义ref实现防抖效果 二,代码部分 1在app.vue中 <template><input v-model"text"/><p class"result">{{text}}</p> </template><script setup> import {debounceRef} from ./u…...

服务器及MySQL安全设置指南
文章目录 Linux安全配置1、密码复杂度策略2、登陆失败策略3、登录超时策略4、安全日志记录5、账户策略5.1 创建系统管理员(应该对/var进行授权,修改可能会影响到ssh登录)5.2 创建安全管理员(应该对/etc进行授权)5.3 创…...
MDX语言的网络编程
MDX语言的网络编程探索 引言 在当今信息技术快速发展的时代,网络编程越来越成为软件开发的重要组成部分。无论是为了创建Web应用,还是为了开发与云服务交互的程序,网络编程的知识愈发显得重要。MDX(Multidimensional Expression…...
client-go中watch机制的一些陷阱
Reference https://stackoverflow.com/questions/51399407/watch-in-k8s-golang-api-watches-and-get-events-but-after-sometime-doesnt-get-an 问题描述 最近在使用 client-go 的 watch 机制监听 k8s 中的 deployment 资源时,发现一个奇怪的现象 先看下代码&a…...

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问
在访问网页的时候,因为浏览器自身的安全设置问题, 对于https的网页访问会出现安全隐私的提示, 甚至无法访问对应的网站,尤其是chrome浏览器, 因此本文主要讲解如何设置chrome浏览器的设置,来解决该问题&…...

Jenkins pipeline 发送邮件及包含附件
Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN (保存TOKEN, 后面Jenkins会用到) Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …...

怎么把word试题转成excel?
在教育行业、学校管理以及在线学习平台中,试题库的高效管理是一项核心任务。许多教育工作者和系统开发人员常常面临将 Word 中的试题批量导入 Excel 的需求。本文将详细介绍如何快速将试题从 Word 转换为 Excel,帮助您轻松解决繁琐的数据整理问题&#x…...

【机器学习】量子机器学习:当量子计算遇上人工智能,颠覆即将来临?
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 在当今科技飞速发展的时代,量子计算与人工智能宛如两颗璀璨的星辰,各自在不同的苍穹闪耀,正以前…...

IDEA配置maven和git并如何使用maven打包和git推送到gitlab
首先找到设置 在里面输入maven然后找到点击 然后点击右边两个选项 路径选择下载的maven目录下的settings文件和新建的repository文件夹 点击apply应用 然后在搜索框里搜git点击进去 此路径为git的exe执行文件所在目录,选好之后点击test测试下方出现git版本号表…...

Supermaven 加入 Cursor:AI 编码新篇章
引言 2024 年 11 月 11 日,我们迎来了一个激动人心的时刻——Supermaven 正式加入 Cursor! 这一合作标志着 AI 编程工具进入了一个新的发展阶段,为开发者提供更智能、更高效的编码体验。本文将带您了解此次合并的背景、意义以及未来的发展方…...
【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)
题目描述 题目:boss的收入 在一个公司中,有一个老板(boss)和若干名员工(employees)。老板和员工的收入信息存储在一个数组中,其中数组的每个元素表示一个人的收入。数组的第0个元素表示老板的…...

《Java8实战》汇总
参考书籍:《Java8 实战》 一、Lambda表达式 Lambda 是一个匿名函数。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 1.1、Lambda表达式的关键:从匿名类到 Lambda 的转换 示例: <span style="background-color:#…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...