【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前

第12章要做一个实例的项目------一个命令行程序。这个程序是一个grep(Global Regular Expression Print ),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。

这个项目分为这么几步:

  • 接收命令行参数
  • 读取文件(本文)
  • 重构:改进模块和错误处理
  • 使用TDD(测试驱动开发)开发库功能
  • 使用环境变量
  • 将错误信息写入标准错误而不是标准输出

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

12.2.2. 回顾

这是截止到上文所写出的所有代码:

rust 复制代码
use std::env;  
  
fn main() {  
    let args:Vec<String> = env::args().collect();  
    let query = &args[1];  
    let filename = &args[2];
      
    println!("search for {}", query);  
    println!("In file {}", filename);  
}

代码到此解决了读取用户指令的部分,接下来要根据用户的输入读取文件。

12.2.3. 读取文件

为了实现读取文件的操作,需要引入std::fs,这个模块可以处理与文件相关的事物:

rust 复制代码
use std::fs;

接下来,根据filename来读取文件:

rust 复制代码
let contents = fs::read_to_string(filename);

当然,读取会可能发生错误,所以它的返回值并不直接就是内容而是Result枚举,针对这个枚举,可以使用expect方法来解包,expect方法的参数是如果发生错误时打印的错误信息(expect方法在 9.2. Result枚举与可恢复的错误 Pt.1 中有详细介绍)。

rust 复制代码
let contents = fs::read_to_string(filename)
.expect("Somthing went wrong while reading the file");//这里换行只是为了这行不过长

如果能成功读取,就把读取到的内容打印出来:

rust 复制代码
println!("With text:\n{}", contents);

12.2.4. 代码测试

实现到这一步,可以对代码进行一些测试了。

这是截止到目前所写出的所有代码:

rust 复制代码
use std::env;  
use std::fs;  
  
fn main() {  
    let args:Vec<String> = env::args().collect();  
    let query = &args[1];  
    let filename = &args[2];  
  
    println!("search for {}", query);  
    println!("In file {}", filename);  
  
    let contents = fs::read_to_string(filename)  
        .expect("Somthing went wrong while reading the file");//这里换行只是为了这行不过长  
    println!("With text:\n{}", contents);  
}

首先在项目目录下创建一个.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!

然后输入命令:

bash 复制代码
cargo run -- the poem.txt
  • 这里的--是代表后面所写的是参数是用来区分Cargo 命令的参数传递给程序的参数的。它的作用是告诉 Cargo,接下来的内容不是 Cargo 的选项或参数,而是运行程序时需要传递给程序的参数。它并不会被读取和存储。
  • the对应的就是要查找的内容,会被存储在query
  • poem.txt就是文件名,会被存储在filename

输出:

复制代码
$ cargo run -- the poem.txt
   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    Finished `dev` profile [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!

没有任何问题。

相关推荐
java1234_小锋17 分钟前
[免费]基于Python的Flask酒店客房管理系统【论文+源码+SQL脚本】
开发语言·人工智能·python·flask·酒店客房
bubiyoushang88830 分钟前
使用MATLAB计算梁单元的刚度矩阵和质量矩阵
开发语言·matlab·矩阵
三掌柜66644 分钟前
C++ 零基础入门与冒泡排序深度实现
java·开发语言·c++
码事漫谈1 小时前
从一个问题深入解析C++字符串处理中的栈损坏
后端
Yyyy4821 小时前
标签Labels、Scheduler:调度器、k8s污点与容忍度
开发语言·kubernetes
来来走走1 小时前
Android开发(Kotlin) 扩展函数和运算符重载
android·开发语言·kotlin
码事漫谈1 小时前
C++ 核心基石:深入理解 RAII 思想,告别资源泄露的噩梦
后端
zz-zjx1 小时前
云原生LVS+Keepalived高可用方案(二)
开发语言·php·lvs
wuwu_q1 小时前
用通俗易懂 + Android 开发实战的方式,详细讲解 Kotlin Flow 中的 retryWhen 操作符
android·开发语言·kotlin
Mos_x1 小时前
使用Docker构建Node.js应用的详细指南
java·后端