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

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

我们需要实现的效果如下,在poem.txt中写入文件内容,我们写入一首诗

中山孺子妾,特以色见珍。虽然不如延年妹,亦是当时绝世人。
桃李出深井,花艳惊上春。一贵复一贱,关天岂由身。
芙蓉老秋霜,团扇羞网尘。戚姬髡发入舂市,万古共悲辛。

运行以下命令

cargo run abc poem.txt

然后屏幕会输出在poem.txt中写入的文件内容

中山孺子妾,特以色见珍。虽然不如延年妹,亦是当时绝世人。
桃李出深井,花艳惊上春。一贵复一贱,关天岂由身。
芙蓉老秋霜,团扇羞网尘。戚姬髡发入舂市,万古共悲辛。

这样就意味着我们取到了传递的命令行参数,并且通过io来读取到了文件的内容。


二、创建新项目

和以前一样,我们找个地方,打开 终端 运行以下新建项目的命令,

cargo new minigrep

然后使用vscode打开minigrep文件夹,里面就是cargo为我们创建好的基础项目。

三、读取参数值

Rust 标准库提供了一个函数std::env::args,返回一个传递给程序的命令行参数的 迭代器迭代器我们在后面会详细介绍,现在你只需记住两件事:

  • 迭代器生成一系列的值
  • 可以在迭代器上调用 collect 方法将其转换为一个集合

我们将传递给程序的命令行参数读取并收集到 vector 中,先导入标准库

use std::env;

然后在 main 中接收该参数,并且调用 collect 方法接收参数,并且存入变量 args

let args: Vec<String> = env::args().collect();

完整代码如下

use std::env;
fn main() {
    let args: Vec<String> = env::args().collect();
    println!("{:#?}", args);
}

接下来我们使用 cargo run 传入参数运行程序看看效果,

cargo run needle haystack

运行效果如下图所示,可以看到,接收到的参数一共有三个,

第一个参数是:二进制文件的名称,也是位置。后面的参数就是我们输入的参数,我们传入的参数一共有两个,但是这里给出了三个参数,这是没有问题的,传入的参数第一个是文件名,接下来才我们传入的参数


四、将参数保存至变量

由于我们将参数存入了 Vector 的变量 args 中,并且我们已知参数的数量和含义是什么,利用以前学过的知识,取到这两个参数

    let query = &args[1];
    let filename = &args[2];

完整代码

use std::env;
fn main() {
    let args: Vec<String> = env::args().collect();
    println!("{:#?}", args);
    let query = &args[1];
    let filename = &args[2];

    println!("Searching for {}", query);
    println!("In file {}", filename);
}

现在运行试试效果,如下图示

五、读取文件

1. 新建文本文件

在项目目录新建文本文件,如下图所示,实际情况任意,本次仅作为例子,

文件内容如下:

中山孺子妾,特以色见珍。虽然不如延年妹,亦是当时绝世人。
桃李出深井,花艳惊上春。一贵复一贱,关天岂由身。
芙蓉老秋霜,团扇羞网尘。戚姬髡发入舂市,万古共悲辛。

2. 导入文件操作函数

文件操作是在标准库中的std::fs下提供的,使用之前我们需要将这些函数导入进来,代码如下:

use std::fs;

3. 读取文件内容

fs::read_to_string 是一个读取文件内容的函数,需要接收 filename ,返回 Result<String>,其中包含文件内容。

在上一小节的代码基础之上,我们进行修改。上节代码

use std::env;
fn main() {
    let args: Vec<String> = env::args().collect();
    println!("{:#?}", args);
    let query = &args[1];
    let filename = &args[2];

    println!("搜索 {}", query);
    println!("在文件 {}", filename);
}

我们已经从命令行参数中读取到了 filename,因此我们只需要将这个参数传递给 fs::read_to_string 就得以得到我们要的文件内容,拿到文件内容以后输出文件内容。

现在我们加入以下代码

let contents = fs::read\_to\_string(filename)
        .expect("读取文件出错");

    println!("读取到的文本为:\n{}", contents);

完整代码:

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


![img](https://img-blog.csdnimg.cn/img_convert/79b3684621c6347fb2d0fd94995d3455.png)
![img](https://img-blog.csdnimg.cn/img_convert/8e525ca8c40a206e82f9abf4e115d9c3.png)
![img](https://img-blog.csdnimg.cn/img_convert/e95bb9dbc5fccce171acbd75515a0fac.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

e-1715358995650)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值