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 then
    print("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) do
    print(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) do
    print(k, v)
end

输出结果如下

Before modification:
1       1
2       2
3       3
key     value

After modification:
2       2
3       3
10      1
key     value

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

2、下面的代码输出什么

local x=15
if x > 10 then
	print(x..">"..10)
elseif x < 10 then
	print(x.."<".."10")
elseif x > 5 then
	print(x..">".."5")
else
	print("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) do
    print(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) do
        table.insert(result, v + b[i])
    end
    return result
end})
local t3 = t1 + t2
print(table.concat(t3, ", "))

输出5,7,9

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv的NLM去噪算法

NLM&#xff08;Non-Local Means&#xff09;去噪算法是一种基于图像块&#xff08;patch&#xff09;相似性的去噪方法。其基本原理是&#xff1a; 图像块相似性&#xff1a;算法首先定义了一个搜索窗口&#xff08;search window&#xff09;&#xff0c;然后在该窗口内寻找…

NineData云原生智能数据管理平台新功能发布|2024年12月版

本月发布 7 项更新&#xff0c;其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象&#xff0c;包括视图&#xff08;View&#xff09;、包&#xff08;Package&#xff09;、存储过程&#xff08;Procedur…

计算机网络 —— 网络编程(TCP)

计算机网络 —— 网络编程&#xff08;TCP&#xff09; TCP和UDP的区别TCP (Transmission Control Protocol)UDP (User Datagram Protocol) 前期准备listen &#xff08;服务端&#xff09;函数原型返回值使用示例注意事项 accpect &#xff08;服务端&#xff09;函数原型返回…

eNSP之家----ACL实验入门实例详解(Access Control List访问控制列表)(重要重要重要的事说三遍)

ACL实验&#xff08;Access Control List访问控制列表&#xff09;是一种基于包过滤的访问控制技术&#xff0c;它可以根据设定的条件对接口上的数据包进行过滤&#xff0c;允许其通过或丢弃。访问控制列表被广泛地应用于路由器和三层交换机。 准备工作 在eNSP里面部署设备&a…

PySide6基于QSlider实现QDoubleSlider

我在写小工具的时候&#xff0c;需要一个支持小数的滑动条。 我QSpinBox都找到了QDoubleSpinBox&#xff0c;QSlider愣是没找到对应的东西。 网上有好多对QSlider封装实现QDoubleSlider的文章。 似乎Qt真的没有这个东西&#xff0c;需要我们自行实现。 于是我也封装了一个&…

即插即用,无缝集成各种模型,港科大蚂蚁等发布Edicho:图像编辑一致性最新成果!

文章链接&#xff1a;https://arxiv.org/pdf/2412.21079 项目链接&#xff1a;https://ezioby.github.io/edicho/ 亮点直击 显式对应性引导一致性编辑&#xff1a;通过将显式图像对应性融入扩散模型的去噪过程&#xff0c;改进自注意力机制与分类器自由引导&#xff08;CFG&…

福建双色荷花提取颜色

提取指定颜色 HSV双色荷花代码验证 参照《OpenCV图像处理技术》 HSV 要用HSV的色调、饱和度和亮度来提取指定颜色。 双色荷花 农林大学金山校区观音湖 代码 import cv2 import numpy as npimgcv2.imread("./sucai6/hua.jpg") cv2.imshow("SRC",img) h…

关于重构一点简单想法

关于重构一点简单想法 当前工作的组内&#xff0c;由于业务开启的时间正好处于集团php-》go技术栈全面迁移的时间点&#xff0c;组内语言技术栈存在&#xff1a;php、go两套。 因此需求开发过程中通常要考虑两套技术栈的逻辑&#xff0c;一些基础的逻辑也没有办法复用。 在这…

【操作系统】课程 7设备管理 同步测练 章节测验

7.1知识点导图 它详细地展示了I/O系统的层次结构、I/O硬件和软件的组成以及它们的功能。下面是对图中内容的文字整理&#xff1a; I/O设备分类 按使用特性分类 输入设备&#xff1a;键盘、鼠标等输出设备&#xff1a;打印机、绘图仪等交互式设备&#xff1a;显示器等 按传输速率…

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…

【Vue.js 组件化】高效组件管理与自动化实践指南

文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中&#xff0c;组件化管理是 V…

4.5 在C++节点中使用参数

本节沿用之前4.3 节小海龟控制例子。 4.5.1 参数声明与设置 打开src/demo_cpp_service/src/turtle_control.cpp文件 添加测试代码 this->declare_parameter("k",1.0);this->declare_parameter("max_speed",1.0);this->get_parameter("k&q…

Java agent

‌ Java Agent是一种特殊的Java程序&#xff0c;它可以在JVM启动时或运行时动态加载&#xff0c;用于监控和修改其他Java应用程序的行为‌。通过Java Agent&#xff0c;开发者可以在不修改目标应用程序源码的情况下&#xff0c;动态地插入功能&#xff0c;如性能分析、日志记录…

Cannot run program “docker“: CreateProcess error=2,系统找不到指定的文件

今天被这个问题坑了, 网上教程全是直接装插件就行 ,结果我连接可以成功 但是执行docker compose 就会出错, 检测配置 报错com.intellil,execution,process.ProcessNotCreatedException: Cannot run program “docker”: CreateProcess error2,系统找不到指定的文件 gpt 要我去…

二、模型训练与优化(4):模型优化-实操

下面我将以 MNIST 手写数字识别模型为例&#xff0c;从 剪枝 (Pruning) 和 量化 (Quantization) 两个常用方法出发&#xff0c;提供一套可实际动手操作的模型优化流程。此示例基于 TensorFlow/Keras 环境&#xff0c;示范如何先训练一个基础模型&#xff0c;然后对其进行剪枝和…

免费图片批量压缩工具-支持批量修改分辨率

工作需求&#xff0c;需要支持修改分辨率上限的同时进行图片压缩&#xff0c;设计此工具。 1.支持批量文件夹、子文件 2.支持最大分辨率上限&#xff08;高于设定分辨率的图片&#xff0c;强制修改为指定分辨率&#xff0c;解决大图的关键&#xff09; 3.自定义压缩质量&#x…

Github上传项目

写在前面&#xff1a; 本次博客仅仅是个人学习记录&#xff0c;不具备教学作用。内容整理来自网络&#xff0c;太多了&#xff0c;所以就不放来源了。 在github页面的准备&#xff1a; 输入标题。 往下滑&#xff0c;创建 创建后会跳出下面的页面 进入home就可以看到我们刚…

并发编程 之 Java内存模型(详解)

Java 内存模型&#xff08;JMM&#xff0c;Java Memory Model&#xff09;可以说是并发编程的基础&#xff0c;跟众所周知的Java内存区域(堆、栈、程序计数器等)并不是一个层次的划分&#xff1b; JMM用来屏蔽各种硬件和操作系统的内存访问差异&#xff0c;以实现让Java程序在各…

[QCustomPlot] 交互示例 Interaction Example

本文是官方例子的分析: Interaction Example 推荐笔记: qcustomplot使用教程–基本绘图 推荐笔记: 4.QCustomPlot使用-坐标轴常用属性 官方例子需要用到很多槽函数, 这里先一次性列举, 自行加入到qt的.h中.下面开始从简单的开始一个个分析. void qcustomplot_main_init(void); …

WPF控件Grid的布局和C1FlexGrid的多选应用

使用 Grid.Column和Grid.Row布局&#xff0c;将多个C1FlexGrid布局其中&#xff0c;使用各种事件来达到所需效果&#xff0c;点击复选框可以加载数据到列表&#xff0c;移除列表的数据&#xff0c;自动取消复选框等 移除复选框的要注意&#xff01;&#xff01;&#xff01;&am…