Rust 文件读取:实现我们的 “迷你 grep”
1. 准备示例文件
首先,在项目根目录(与 Cargo.toml 同级)下新建一个名为 poem.txt 的文件。示例内容可参考 Emily Dickinson 的诗:
I'm nobody! Who are you?
Are you nobody, too?
Then there's a pair of us — don't tell!
They'd banish us, you know.
这为我们后续的搜索及测试提供了多行文本。
2. 在 src/main.rs 中读入文件
让我们打开 src/main.rs,在前面已经实现的“获取命令行参数”逻辑后,添加读取文件内容的功能。完整示例如下:
use std::env;
use std::fs;fn main() {let args: Vec<String> = env::args().collect();let query = &args[1]; // 搜索关键字(暂时没用到)let file_path = &args[2]; // 文件路径println!("Searching for: {}", query);println!("In file: {}", file_path);let contents = fs::read_to_string(file_path).expect("Should have been able to read the file");println!("File contents:\n{contents}");
}
代码解读
-
use std::fs;- 我们从标准库引入了
fs模块来完成文件操作。
- 我们从标准库引入了
-
fs::read_to_string(file_path)- 该函数以只读方式打开指定文件并读取其完整内容。它返回一个
Result<String>,如果读取成功即包含文本内容,否则包含错误信息。
- 该函数以只读方式打开指定文件并读取其完整内容。它返回一个
-
expect("...")- 简化的错误处理方式。如果无法读取文件,程序会在此处退出并打印自定义错误信息。
-
println!("File contents:\n{contents}")- 打印出文件全部内容,以便确认我们成功地读取到文件。
3. 运行示例
我们假设要在文件中搜索“searchstring”(功能尚未实现,但先用它做参数示例):
$ cargo run -- searchstring poem.txtCompiling minigrep v0.1.0 (~/minigrep)Finished dev [unoptimized + debuginfo] target(s) in 0.74sRunning `target/debug/minigrep searchstring poem.txt`
Searching for: searchstring
In file: poem.txt
File contents:
I'm nobody! Who are you?
Are you nobody, too?
Then there's a pair of us — don't tell!
They'd banish us, you know.
如输出所示,minigrep 成功打印了 poem.txt 的全部文本。
4. 潜在问题及后续改进
当前代码虽能正常运行,但仍有一些可优化之处:
-
main函数职责过多main同时负责解析参数、读取文件、打印内容,如果将来添加更多功能,会越来越臃肿。- 我们可以将配置解析与文件搜索等操作拆分到单独的函数或模块。
-
错误处理不够灵活
- 这里我们使用
expect简化了错误处理,一旦出错程序就立刻崩溃。 - 若是生产环境,可考虑返回
Result并进行更完善的错误提示与恢复机制。
- 这里我们使用
-
搜索功能尚未实现
- 虽然可以成功读取文件,但还无法对文件内容进行关键字查找。
- 后续我们会在搜索逻辑、大小写处理、行输出等方面展开更多讨论。
为什么要及早重构
即使代码规模目前很小,也最好在开发早期就抽离出清晰的模块或函数,避免随着功能增多而难以维护。Rust 重视“让正确的事情更简单、错误的事情更困难”,在我们添加更多功能前,先把当前结构打好基础会有助于长期维护与扩展。
5. 总结
本篇内容主要实现了:
- 如何使用
std::fs::read_to_string读取文件内容; - 如何在命令行工具中打印所读取的文本结果;
后面,我们会重点将“搜索”功能添加到 minigrep,并改善程序结构和错误处理,让它成为一个小而完整的文本搜索器。希望你已对 Rust 的文件 IO 操作有了直观理解,欢迎继续关注后续改进!
相关文章:
Rust 文件读取:实现我们的 “迷你 grep”
1. 准备示例文件 首先,在项目根目录(与 Cargo.toml 同级)下新建一个名为 poem.txt 的文件。示例内容可参考 Emily Dickinson 的诗: Im nobody! Who are you? Are you nobody, too? Then theres a pair of us — dont tell! Th…...
【Unity3D】Jenkins Pipeline流水线自动构建Apk
目录 一、准备阶段 二、创建Pipeline流水线项目 三、注意事项 一、准备阶段 1、安装tomcat 10.0.5 Index of apache-local/tomcat/tomcat-10 2、安装jdk 17 Java Archive Downloads - Java SE 17.0.13 and later 3、下载Jenkins 2.492.1 (.war)包 War Jenkins Packa…...
信息收集-Web应用备案产权Whois反查域名枚举DNS记录证书特征相似查询
知识点: 1、信息收集-Web应用-机构产权&域名相关性 2、信息收集-Web应用-DNS&证书&枚举子域名 企业信息 天眼查 https://www.tianyancha.com/ 企业信息 小蓝本 https://www.xiaolanben.com/ 企业信息 爱企查 https://aiqicha.baidu.com/ 企业信息 企查…...
结合实际讲NR系列2—— SIB1
这是在基站抓取的sib1的一条信令 L3MessageContent BCCH-DL-SCH-Messagemessagec1systemInformationBlockType1cellSelectionInfoq-RxLevMin: -64q-QualMin: -19cellAccessRelatedInfoplmn-IdentityListPLMN-IdentityInfoplmn-IdentityListPLMN-IdentitymccMCC-MNC-Digit: 4MC…...
绿虫仿真软件如何预测组件衰减对收益的影响?
绿虫仿真软件通过其精细化的算法模型,能够有效预测组件衰减对光伏电站收益的影响,主要体现在以下几个方面: 1. 数据基础与模型构建 历史数据分析:绿虫软件整合了长达20年的历史数据,涵盖气象、地理、组件型号、逆变器…...
本地部署DeepSeek集成VSCode创建自己的AI助手
文章目录 安装Ollama和CodeGPT安装Ollama安装CodeGPT 下载并配置DeepSeek模型下载聊天模型(deepseek-r1:1.5b)下载自动补全模型(deepseek-coder:1.3b) 使用DeepSeek进行编程辅助配置CodeGPT使用DeepSeek模型开始使用AI助手 ✍️相…...
07贪心 + 动态规划(D1_基础学习)
目录 讲解一:贪心算法 一、什么是贪心算法? 二、贪心算法的应用场景 三、使用Java代码实现贪心算法 四、知识小结 -------------------------------- 讲解二:动态规划算法 一、什么是动态规划算法 二、动态规划算法求解问题需要具备的…...
redis之数据库
文章目录 服务器中的数据库切换数据库数据库键空间读写键空间时的维护操作 设置键的生存时间或过期时间保存过期时间过期键的判定过期键删除策略清性删除策略的实现定期删除策略的实现 总结 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结…...
【竞技宝】电竞世界杯:无畏契约首次入选正式项目!
北京时间2月12日,电竞世界杯基金会(EWCF)与知名游戏开发商拳头游戏(Riot Games)在近日共同宣布达成三年合作伙伴关系。同时,三大顶级电竞项目——《英雄联盟》《英雄联盟:云顶之弈》(…...
Golang GORM系列:GORM 高级查询教程
有效的数据检索是任何程序功能的基础。健壮的Go对象关系映射包(称为GORM)除了标准的CRUD操作之外,还提供了复杂的查询功能。这是学习如何使用GORM进行高级查询的综合资源。我们将涵盖WHERE条件、连接、关联、预加载相关数据,甚至涉…...
智能GUI Agent是什么,有什么应用领域
智能GUI Agent是什么 研究背景与目的:GUI长期主导人机交互,LLM特别是多模态模型的出现,为GUI自动化带来变革,催生了基于LLM的GUI智能体。这些智能体可理解自然语言指令,处理复杂GUI元素并执行操作,改变了用户与软件交互方式。论文旨在梳理该领域发展脉络,剖析关键要素,…...
k8s优雅操作pod容器组
k8s优雅操作pod容器组 回退备份 kubectl get deploy deployName -o yaml>>deployName-bak-date "%Y-%m-%d".yaml获取副本数 replicasecho | kubectl get -o template deploy/deployName --template{{.spec.replicas}}停止容器组 kubectl scale deployment …...
在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.20.2
文章目录 1. 安装 nvm(如果还没有安装的话)2. 加载 nvm 配置3. 列出特定系列的 Node.js 版本(远程):4. 安装 Node.js 16.20.25. 使用指定版本的 Node.js6. 验证安装 在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.…...
MySQL创建存储过程和存储函数
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...
PyQt学习记录03——批量设置水印
0. 目录 PyQt学习记录01——加法计算器 PyQt学习记录02——串口助手 1. 前言 本次主要是为了学习Qt中的 QFileDialog 函数, QFileDialog.getExistingDirectory:用于选择文件夹,返回的是一个文件夹路径。 QFileDialog.getOpenFileName&…...
vivo手机和Windows电脑连接同一个WiFi即可投屏!
虽然现在很多人喜欢刷手机,但是对于长时间需要使用手机办公的人来说,手机屏幕还是太小了,当人一天二十四小时中要花费近十个小时摆弄手机,就会渴望手机屏幕能够大一点,至少看的时候,眼睛舒服一点。 因为嫌弃…...
芯盾时代数据安全产品体系,筑牢数据安全防线
芯盾时代数据安全治理(DSG)框架,以国家法律法规、行业监管标准、行业最佳实践为依据,从数据安全战略出发,以数据分类分级为支撑,构数据安全管理体系、数据安全技术体系、数据安全运营体系与数据安全监督评价…...
异位妊娠唯一相关的是年龄(U型曲线)
异位妊娠唯一相关的是年龄(U型曲线) 简介 异位妊娠,俗称宫外孕,是指受精卵在子宫体腔以外着床发育的异常妊娠过程 。正常情况下,受精卵会在子宫内着床并发育成胎儿,但在异位妊娠中,受精卵却在…...
CTF-WEB: 利用Web消息造成DOM XSS
如果索引中有类似如下代码 <!-- Ads to be inserted here --> <div idads> </div> <script>window.addEventListener(message, function(e) {document.getElementById(ads).innerHTML e.data;}); </script>这行代码的作用是将接收到的消息内容…...
【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...
从混乱到秩序:如何用TrguiNG汉化版重塑你的Transmission下载管理体验
从混乱到秩序:如何用TrguiNG汉化版重塑你的Transmission下载管理体验 【免费下载链接】TrguiNG Transmission WebUI 基于 openscopeproject/TrguiNG 汉化和改进 项目地址: https://gitcode.com/gh_mirrors/tr/TrguiNG 你是否还在为Transmission简陋的原生Web…...
终极指南:Shoelace如何利用Shadow DOM实现完美样式隔离
终极指南:Shoelace如何利用Shadow DOM实现完美样式隔离 【免费下载链接】shoelace Shoelace is now Web Awesome. Come see what’s new! 项目地址: https://gitcode.com/gh_mirrors/sh/shoelace Shoelace(现已更名为Web Awesome)作为…...
基于Lepton AI构建对话式搜索引擎:RAG技术实践指南
1. 项目概述:用Lepton AI构建你的对话式搜索引擎 如果你对AI应用开发感兴趣,尤其是想快速搭建一个能理解自然语言、并能联网搜索的智能助手,那么“Search with Lepton”这个项目绝对值得你花时间研究。它本质上是一个开源的对话式搜索引擎框…...
Cursor Pro破解工具终极指南:5步实现永久免费使用的完整教程
Cursor Pro破解工具终极指南:5步实现永久免费使用的完整教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached yo…...
嵌入式处理器IP选型指南:从ARM到RISC-V的权衡与实战
1. 从一场早餐会聊起:为什么32位处理器IP依然是嵌入式开发的硬通货最近在整理资料时,翻到一篇十多年前的老新闻,说的是IP供应商CAST要在DesignCon 2012上办一场免费的早餐研讨会,主题是他们新推出的BA22 32位处理器IP核。新闻里笔…...
手机号到QQ号查询技术实现原理与TEA加密通信架构解析
手机号到QQ号查询技术实现原理与TEA加密通信架构解析 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq phone2qq是一个基于Python实现的逆向工程工具,通过分析腾讯QQ客户端的通信协议,实现了通过手机号查询对应…...
TrguiNG汉化版:三招彻底改变你的Transmission远程管理体验
TrguiNG汉化版:三招彻底改变你的Transmission远程管理体验 【免费下载链接】TrguiNG Transmission WebUI 基于 openscopeproject/TrguiNG 汉化和改进 项目地址: https://gitcode.com/gh_mirrors/tr/TrguiNG 你是否还在忍受Transmission原生的简陋Web界面&…...
2026 年行业真相:履职规范背后的管理秘密
现场冲突:安全与进度的激烈碰撞在工程建设领域,安全与进度的冲突一直是个老大难问题。就拿上海中心的建设来说,如此庞大复杂的项目,施工过程中安全管理难度极大。在某些施工阶段,为了赶进度,部分施工人员可…...
机器视觉在人工智能领域的应用
机器视觉在人工智能领域的应用 目录机器视觉在人工智能领域的应用一、图像处理与机器视觉的概念阐述1. 图像处理(Image Processing)2. 机器视觉(Machine Vision / Computer Vision)二、图像处理与机器视觉的区别与共同点区别共同点…...
AMD锐龙处理器深度调优终极指南:5种专业级配置策略
AMD锐龙处理器深度调优终极指南:5种专业级配置策略 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitco…...
