The Rust Programming Language - 第12章 一个I/O项目:构建命令行程序 - 12.2 读取文件

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

本章我们将会构建一个与文件和命令行输入/输出交互的命令行工具来练习已经学过的Rust技能

Rust的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择,所以我们将创建一个我们自己的经典命令行工具grep(globally research a regular expression and print)

Grep最简单的使用场景是在特定文件中搜索指定字符串

在这个过程中,我们的命令行工具会用到终端功能,读取环境变量来使得用户可以配置工具,打印到标准错误控制流而不是标准输出。这样用户可以选择将成功输出重定向到文件中同时也能够在屏幕上显示错误信息

并且我们在本章会涉及代码组织、vector和字符串、错误处理、trait和生命周期以及测试,另外闭包、迭代器我们也也会了解一点点

12.2 读取文件

我们已经能够通过传递参数、保存变量并且打印出,现在让我们来用一个实例实现一下

我们先来在项目根目录创建一个测试文档: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!

接下来我们修改一下打开这个文件的代码,我们引入标准库的另一个函数fs::read_to_string,这个函数接受文件名称作为参数,返回的是一个枚举Result,并且我们把所读内容给了contents这个变量,而且最后调用了println!宏打印出来

使用cargo run the poem.txt命令,结果如我们所料

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

fn main() {
    let args:Vec = env::args().collect();
    let query = &args[1];
    let filename = &args[2];

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

    let contents = fs::read_to_string(filename)
          .expect("Something went wrong reading the file");
     
     println!("With text:\n{}", contents)
}
//
% cargo run the poem.txt
    Finished dev [unoptimized + debuginfo] target(s) in 0.05s
     Running `/Users/qinjianquan/minigrep/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!

虽然,基本目的我们是达到了,但是显然上述代码非常不合理,下一节我们将会探讨这个问题

你可能感兴趣的:(#,Rust,rust,开发语言,后端,函数,参数)