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

开发环境

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

本章重点

  • 如何获取命令行参数
  • 如何读取文件

相关推荐

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

    2023-12-29 22:44:04       30 阅读
  2. Go读取文件n的思路

    2023-12-29 22:44:04       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 22:44:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 22:44:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 22:44:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 22:44:04       20 阅读

热门阅读

  1. 【AI】人工智能爆发推进器之变分自动编码器

    2023-12-29 22:44:04       42 阅读
  2. UE5.1_移动端运行问题梳理

    2023-12-29 22:44:04       33 阅读
  3. 《网络安全面试总结》--大厂面试题目及经验

    2023-12-29 22:44:04       32 阅读
  4. LeetCode 2660. 保龄球游戏的获胜者

    2023-12-29 22:44:04       34 阅读
  5. 力扣200. 岛屿数量

    2023-12-29 22:44:04       37 阅读
  6. 中介者模式(Mediator)

    2023-12-29 22:44:04       36 阅读
  7. 未来编程语言的演进:迎接技术革新的挑战

    2023-12-29 22:44:04       36 阅读