读取文件
现在我们将添加功能以读取在 file_path
参数中指定的文件。首先我们需要一个示例文件来测试它:我们将使用一个包含少量文本的文件,这些文本分布在多行中,并且有一些重复的单词。列表 12-3 有一首艾米莉·狄金森的诗,非常适合!在项目的根目录下创建一个名为 poem.txt 的文件,并输入诗“我是无名之辈!你是谁?”
在文本就位后,编辑 src/main.rs 并添加代码以读取文件,如清单 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` 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!
很好!代码读取并打印了文件的内容。但代码有一些缺陷。目前,main
函数有多个职责:通常,如果每个函数只负责一个概念,函数会更清晰且更容易维护。另一个问题是,我们没有很好地处理错误。程序仍然很小,所以这些缺陷不是大问题,但随着程序的增长,干净地修复它们将变得更加困难。在开发程序时,尽早开始重构是一个好习惯,因为重构少量代码要容易得多。我们接下来就做这件事。