14.2.读文件

我们实现从变量file_path获取文件路径,然后从该文件中读取信息。首先我们需要一个文本文件进行测试;文件名是poem.txt,该文件包含多行文本并有一些重复的单词。如下所示的一首艾米丽.狄更斯的诗:

bash 复制代码
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!

这个文件需要保存到项目的根目录内。修改代码读取文件中的信息:

rust 复制代码
use std::env;

use std::fs;

fn main() {

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

    //dbg!(args);

    let query = &args[1];

    let file_path = &args[2];


    println!("要查找的字符串是{query}");

    println!("在{file_path}文件中");

    let contents = fs::read_to_string(file_path).expect("无法读取这个文件{file_path}");

    println!("文件中的内容是:\n{contents}");

}

首先使用use引入标准库中相关模块,以便我们可以使用std::fs来处理文件操作。

在主函数中我们使用fs::read_to_string函数并传入file_path参数,打开该文件并返回std::io::Result<String>类型的文件内容。

然后再次使用println函数向屏幕上输出文件内容信息,以便我们可以检核程序是否运行正常。

运行这段代码,第一个参数随便输入一些信息,因为还没有实现搜索字符串的功能,第二个参数为poem.txt,是我们刚刚创建的文本文件,并保存到项目根目录的位置上。运行结果如下所示:

rust 复制代码
cargo run -- test poem.txt

warning: `C:\Users\刘海涛\.cargo\config` is deprecated in favor of `config.toml`

  |

  = help: if you need to support cargo 1.38 or earlier, you can symlink `config` to `config.toml`

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.07s

     Running `target\debug\lession14_001.exe test poem.txt`

要查找的字符串是test

在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!

很好这段代码可以去取文件中的内容并显示。但是代码还有很多缺陷,此时,主函数有多个任务:通常来说,如果每一个功能只负责一个主题,则代码及清晰也容易理解。还有一些问题是我们没有考虑到异常情况和对应的错误处理。因为这个程序还是非常小,这些缺陷并不是很大的问题,但是随着代码的增长,它将很难使代码变得清晰。在程序开发的早期进行代码重构将是非常可取的,因为更小的代码量更容易重构。

相关推荐
阳光是sunny8 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦8 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny8 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
-银雾鸢尾-8 小时前
C#中的StringBuilder相关方法
开发语言·c#
皮皮林5519 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
-银雾鸢尾-9 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
努力的小雨9 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康10 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求