当前位置: 首页 > news >正文

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、我们都知道&#xff0c;在任何语言当中都有输入输出&#xff0c;比如c语言当中就有很多printf,scanf,get ,put,gets,puts,文件io:open,read,write,close,标准io:fopen,fread,fwrite,fclose.在lua语言当中&#xff0c;也有相同的一些输入输出特性&#xff0c;叫io.open,io.re…...

C语言基本知识复习浓缩版:输出函数printf

输出函数printf学习 printf()的作用是将文本输出到屏幕上使用之前需要先引入stdio.h头文件printf函数在使用的时候&#xff0c;至少需要一个参数 printf() 是 C 语言标准库中的一个函数&#xff0c;用于将格式化的文本输出到标准输出设备&#xff08;通常是屏幕&#xff09;。…...

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

Ungoogled Chromium127 编译指南 MacOS篇(七)- 安装依赖包

1. 引言 在获取了 Ungoogled Chromium 的源代码之后&#xff0c;我们需要安装所有必要的依赖包。这些依赖包对于成功编译 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程序后&#xff0c;除了用户做的界面&#xff0c;最上面还有一个框&#xff0c;这就是window frame框。对于界面的元素&#xff0c;它们的原点是Qt界面的左上角或win…...

在vue3项目中利用自定义ref实现防抖

一&#xff0c;效果展示 自定义ref实现防抖效果 二&#xff0c;代码部分 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 创建系统管理员&#xff08;应该对/var进行授权&#xff0c;修改可能会影响到ssh登录&#xff09;5.2 创建安全管理员&#xff08;应该对/etc进行授权&#xff09;5.3 创…...

MDX语言的网络编程

MDX语言的网络编程探索 引言 在当今信息技术快速发展的时代&#xff0c;网络编程越来越成为软件开发的重要组成部分。无论是为了创建Web应用&#xff0c;还是为了开发与云服务交互的程序&#xff0c;网络编程的知识愈发显得重要。MDX&#xff08;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 资源时&#xff0c;发现一个奇怪的现象 先看下代码&a…...

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问

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

Jenkins pipeline 发送邮件及包含附件

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

怎么把word试题转成excel?

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

【机器学习】量子机器学习:当量子计算遇上人工智能,颠覆即将来临?

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在当今科技飞速发展的时代&#xff0c;量子计算与人工智能宛如两颗璀璨的星辰&#xff0c;各自在不同的苍穹闪耀&#xff0c;正以前…...

IDEA配置maven和git并如何使用maven打包和git推送到gitlab

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

Supermaven 加入 Cursor:AI 编码新篇章

引言 2024 年 11 月 11 日&#xff0c;我们迎来了一个激动人心的时刻——Supermaven 正式加入 Cursor&#xff01; 这一合作标志着 AI 编程工具进入了一个新的发展阶段&#xff0c;为开发者提供更智能、更高效的编码体验。本文将带您了解此次合并的背景、意义以及未来的发展方…...

【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)

题目描述 题目&#xff1a;boss的收入 在一个公司中&#xff0c;有一个老板&#xff08;boss&#xff09;和若干名员工&#xff08;employees&#xff09;。老板和员工的收入信息存储在一个数组中&#xff0c;其中数组的每个元素表示一个人的收入。数组的第0个元素表示老板的…...

《Java8实战》汇总

参考书籍:《Java8 实战》 一、Lambda表达式 Lambda 是一个匿名函数。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 1.1、Lambda表达式的关键:从匿名类到 Lambda 的转换 示例: <span style="background-color:#…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...