Rust之构建命令行程序(二):读取文件

在 Rust 中读取文件的 4 种方法 将整个文件作为字符串读取 将整个文件作为 Vector 读取 逐行读取文本文件 读取带有缓冲区的文件 阅读详情

开发环境

  • Windows 10
  • Rust 1.74.1

 

  • VS Code 1.85.1

项目工程

这次创建了新的工程minigrep.

读取文件

现在,我们将添加读取file_path参数中指定的文件的功能。首先,我们需要一个样本文件来测试它:我们将使用一个包含少量文本的文件,多行包含一些重复的单词。示例12-3中有一首艾米莉·狄金森的诗,效果很好!在项目的根级别创建一个名为poem.txt的文件,输入诗歌“我是无名小卒!你是谁?”

文件名:poem.txt

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.

How dreary to be somebody!
How public, like a frog
To tell your name the livelong day
To an admiring bog!

 示例12-3:艾米莉·狄金森的一首诗是一个很好的测试案例

 文本就绪后,编辑src/main.rs并添加代码来读取该文件,如示例12-4所示。

文件名:src/main.rs

use std::env;
use std::fs;

fn main() {
    let args: Vec<String> = env::args().collect();
    
    let file_path = &args[2];
    // --snip--
    println!("In file {}", file_path);

    let contents = fs::read_to_string(file_path)
        .expect("Should have been able to read the file");

    println!("With text:\n{contents}");
}

示例12-4:读取第二个参数指定的文件内容

首先,我们引入标准库的相关部分和一个use声明:我们需要std::fs来处理文件。 

在main中,新语句fs::read_to_string接受file_path,打开该文件,并返回文件内容的std::io::Result<String >。 

之后,我们再次添加一个临时的println!语句,该语句在文件被读取后打印contents的值,因此我们可以检查程序到目前为止是否工作正常。

让我们运行这段代码,将任意字符串作为第一个命令行参数(因为我们还没有实现搜索部分),将poem.txt文件作为第二个参数:

$ cargo run -- the poem.txt
   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    Finished dev [unoptimized + debuginfo] target(s) in 0.0s
     Running `target/debug/minigrep the poem.txt`
Searching for the
In file poem.txt
With text:
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.

How dreary to be somebody!
How public, like a frog
To tell your name the livelong day
To an admiring bog!

 太好了!代码读取然后打印文件的内容。但是代码有一些缺陷。目前,main有多重职责:一般来说,如果每个功能只负责一个想法,功能会更清晰,更容易维护。另一个问题是我们没有尽可能好地处理错误。程序仍然很小,所以这些缺陷不是大问题,但是随着程序的增长,干净地修复它们会变得更加困难。在开发程序的早期开始重构是一个很好的实践,因为重构少量的代码要容易得多。我们接下来会这么做。 

本章重点

  • 如何获取命令行参数
  • 如何读取文件
Rust编程基础教程:命令行工具开发 作者:禅与计算机程序设计艺术 1.背景介绍 Rust语言是一个功能强大的编程语言,其特点之一就是安全、高效、跨平台等。Rust语言拥有丰富的标准库和工具链,可以让开发者轻松编写健壮、高性能的代码。其中命令行工具(Command-line tool)也同样受到欢迎。命令行工具一般用来做一些重复性的任务 阅读详情

相关推荐

【Rust】Rust获取命令行参数以及IO操作

Rust作为一门系统编程语言,提供了强大且安全的I/O操作支持。与C/C++不同,Rust通过所有权系统和丰富的类型系统,在编译期就能避免许多常见的I/O错误。Rust的标准库std::io模块包含了大多数I/O功能,而std::fs模块则专门处理文件系统操作。

景天科技苑 5万+

Rust跨平台调用系统命令:使用Command库实现参数传递与工作目录切换

本文详细介绍了如何在Rust中使用Command库实现跨平台系统命令调用,包括参数传递、工作目录切换等实用技巧。通过具体代码示例和跨平台对比表格,帮助开发者高效处理不同操作系统下的命令执行差异,提升自动化脚本的兼容性和可靠性。

weixin_27051161的博客 240

相位相关匹配法的opencv C++实现

这一段就是PCIAM算法的核心了,计算两幅图像的峰值相关矩阵,也是完全按照matlab移植过来的,但是后面几行,是为了筛选一些不可能存在的情况,比如边缘处的完全重合,或者只有一行,或者一列重合等等情况,由于PCIAM算法在边缘处的响应值高,所以在一些场景下可能是一种干扰,所以进行了剔除,当然可以不剔除,就是对后期的峰值选取会有影响。头文件,以及各类函数,还有主函数,第一次独立的写这种分文件类型的项目,写的拉跨还请包涵,以及当然可以转成类的形式,但感觉有点小麻烦,后期再修改吧。

qq_43616651的博客 4260

rust使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

想要在不同的平台上运行flutter doctor命令,就需要知道对应的平台是windows还是linux,如果是windows就需要调用cmd命令,如果是linux平台,就需要调用sh命令,所以可以通过cfg!实现不同平台的判断,然后调用不同的脚本。来启动 Windows 的命令行解释器,并通过参数。方法获取命令的输出,并将其打印出来。在这个示例中,我们首先指定了要运行命令的目录。替换为实际的 Flutter 项目目录路径。来告诉它执行完后退出。命令切换到指定目录,然后执行。

3149

告别视频广告:OpenWrt下luci-app-adbyby plus/lite的完整配置与避坑手册

本文详细介绍了在OpenWrt路由器上配置Adbyby Plus/Lite广告屏蔽工具的完整流程与优化方案。从环境准备、规则文件手动配置到高级性能调优,帮助用户有效拦截视频前贴片广告和弹窗广告,提升家庭网络浏览体验。特别针对官方源停止维护的问题,提供了实用的规则更新解决方案。

weixin_29306011的博客 737

MicroLogix1400编程(使用RSLogix 500 + RSLinx Classic Lite)

MicroLogix1400编程

noscallion的博客 1万+

rust:执行shell命令

rust:执行shell命令rust执行shell命令(1)没有参数的命令(2)带参数的命令(3)一个命令,多个参数分开执行(4)命令插入环境变量(5)命令移除环境变量(6)清除程序中所有环境变量 rust执行shell命令 使用rust执行shell命令 参考rust doc:rust doc :Command命令 (1)没有参数的命令 shell命令: #: ls rust 代码实现 main.rs: use std::process::Command; // 引入命令模块 let output =

xkjscm的博客 1万+

Python爬取腾讯视频m3u8加密流实战(附完整代码)

本文提供了一份详细的Python实战教程,指导如何通过抓包分析、模拟请求头与载荷,破解腾讯视频的m3u8加密流防盗链机制,并附上完整代码实现视频片段的下载与合并。教程涵盖从侦察到代码实现的完整流程,并包含参数动态化、多线程下载等高级技巧与避坑指南,旨在帮助开发者掌握流媒体下载的核心技术。

weixin_29090089的博客 1595

Rust之构建命令行程序(一):接受命令行参数

Rust之构建命令行程序,接受命令行参数

wing的专栏 2000

Open3D 教程学习指南 (持续整理)

Open3D 是一个开源库,旨在为 3D 数据处理提供高效且易用的工具。它由 Intel 开发和维护,支持多种 3D 数据处理任务,如点云处理、3D 重建、几何处理和可视化等。

Chase Blog 5929

VOWIFI--相关的协议文档

一、3GPP相关协议文档 3GPP 23.402 Architecture enhancements for non-3GPP accesse- //重要 整体框架结构和流程,3GPP和NON-3GPP切换 3GPP 36.304  User Equipment (UE) procedures in idle mode //重要,终端在空闲状态下3GPP与NON-3GPP之间的重选方法   3GP

时九博客 3578

【一起学Rust · 项目实战】命令行IO项目minigrep——接收命令行参数与读取文件内容

本系列文章章将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。grep是 “GRegularEPrint.” 的首字母缩写。grep最简单的使用场景是在特定文件中搜索指定字符串。为此,grep获取一个文件名和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。以上就是本节的所有内容。如何接收命令行参数将命令行参数拆解开来。......

专注Rust编程与技术分享,涵盖C++、Python等开发实战,新手友好,专注实战,助力编程成长。 9万+

【ArcGIS】07 ArcHydroTools对COM组件的调用返回了错误

在用Arc Hydro Tools提取流域时,在DEM Reconditioning时可能会遇到这个问题: 经过摸索,发现了问题产生的原因: 结果文件保存在了有中文的路径中。 解决的办法: 首先,把ArcGIS切换成英文版 搜索ArcGlS Administrator,以管理员方式打开 点击高级,选择语言为English 其次,新建mxd文档 删除原来的mxd文档,新建mxd文档,放置原来的图层文件。如果不这样做,最后一步的Map Name还会是“图层”这两个汉字。 最后,设置Arc Hydro T

记录专业模型开发、算法程序设计、软件学习笔记、生活日志。 4918

【跟小嘉学 Rust 编程】十二、构建一个命令行程序

本章是一个目前所学的很多技能的应用,以及标准库的探索,我们讲构建一个命令行程序工具来练习现在已经学习过的一些Rust的技能。我们将构建自己的版本的命令行工具:grep(Globally search a Regular Expression and print)。主要教材参考 《The Rust Programming Language》

小嘉丶学长的博客 2987

Python 爬虫实战:爬取微博热搜与用户评论数据

本文系统讲解微博热搜榜单与用户评论数据的爬取技术方案。针对微博热搜榜采用Requests+BeautifulSoup解析静态HTML结构,实现高效爬取;对于动态加载的评论数据,使用Selenium模拟浏览器行为规避反爬机制。详细阐述技术选型、反爬策略、数据清洗及存储方法,提供完整代码实现和输出示例。同时强调合规要求,提示开发者需在遵守平台规则的前提下进行数据采集。该方案为舆情分析和热点研究提供了可落地的技术实现路径。

2503_91057718的博客 1713

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Rust学习-构建命令行程序

Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择本文以实现一个minigrep为例,展开对之前学习的回归。

wangkai6666的博客 1458

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Rust】Rust学习 第十二章一个 I/O 项目:构建一个命令行程序

本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。grep。grep 是 “egularrint.” 的首字母缩写。grep最简单的使用场景是在特定文件中搜索指定字符串。为此,grep获取一个文件名和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。在这个过程中,我们会展示如何让我们的命令行工具利用很多命令行工具中用到的终端功能。

StudyWinter的博客 2064

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Rust从0到1实战系列篇 如何一个 I/O 项目:构建一个命令行程序

本章通过构建一个简化版grep命令行程序来练习Rust的关键功能。项目名为minigrep,能够接受文件路径和搜索字符串两个参数,读取文件内容并打印匹配行。首先使用std::env::args()获取命令行参数,将查询字符串和文件路径存入变量。然后通过std::fs::read_to_string读取文件内容并打印。虽然当前功能简单,但后续会处理错误并分离功能模块。这个项目展示了Rust在构建命令行工具方面的优势,并为理解更复杂的类似项目(如ripgrep)打下基础。完整代码可从示例12-1至12-4中查看

m0_68635815的博客 795

Rust学习记录--C12 实例:写一个命令行程序

要求:在一个文件中搜索字符串返回对应的行的列表。

weixin_44900096的博客 905

Rust 从零到精通:构建一个专业级命令行工具 greprs

欢迎来到 Rust 的世界!Rust 是一门现代化的系统编程语言,专注于性能、内存安全和并发性。它没有垃圾回收器,却能通过强大的编译器和所有权系统在编译时就保证内存安全。这使得 Rust 成为构建高性能、高可靠性软件的绝佳选择,从底层的操作系统、游戏引擎,到高性能 Web 后端和云原生应用,无处不见其身影。本教程将不仅仅是“Hello, world!我们的目标是带您走过一段完整的旅程:从在 Linux 环境下安装 Rust,到亲手构建一个功能完整、结构清晰、经过专业测试的命令行文本搜索工具——

2301_80863610的博客 1万+

Rust之构建命令行程序(三):重构改进模块化和错误处理

Rust之构建命令行程序(三):重构改进模块化和错误处理

wing的专栏 1652

11、Rust程序设计语言——构建一个命令行程序

Rust学习笔记

qq_51180928的博客 499

Rust入门(八):构建一个命令行程序

Rust入门(八):构建一个命令行测试程序的例子

weixin_46463785的博客 1361

第12章 一个 I/O 项目:构建一个命令行程序

本章既是一个目前所学的多项技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 概念。

chenyijun的专栏 640

12-输入/输出项目构建命令行程序

测试驱动开发(TDD, test-driven development)是一种软件开发方法,即在实际代码执行之前编写测试。它是一种用于确保所开发的软件满足指定要求的技术,并有助于在开发周期的早期捕捉错误。该过程遵循一个短暂的重复周期,Red-Green-Refactor,即 "红-绿-重构":①. 红色编写一个定义函数或函数改进的测试,该测试最初失败的原因应该是函数不存在或不按预期执行。②. 绿色:编写通过测试所需的最少代码量。这一阶段的主要目标是在遵守指定要求的前提下尽快通过测试。

优快云爱好者的独到见解 1322

青少年编程与数学 02-019 Rust 编程基础 18课题、命令行程序

使用 Rust 编写一个处理 I/O 的命令行程序,以及涉及的关键知识点的讲解。

明月看潮生的博客 1667
上一篇: Rust之构建命令行程序(一):接受命令行参数
下一篇: Rust之构建命令行程序(三):重构改进模块化和错误处理
枫★曦
博客等级 码龄19年 251粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值