You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
### 读取文件
> [ch12-02-reading-a-file.md](https://github.com/rust-lang/book/blob/main/src/ch12-02-reading-a-file.md)
> <br>
> commit 02a168ed346042f07010f8b65b4eeed623dd31d1
现在我们要增加读取由 `file_path` 命令行参数指定的文件的功能。首先,需要一个用来测试的示例文件:我们会用一个拥有多行少量文本且有一些重复单词的文件。示例 12-3 是一首艾米莉·狄金森( Emily Dickinson) 的诗, 它正适合这个工作! 在项目根目录创建一个文件 `poem.txt` ,并输入诗 "I'm nobody! Who are you?":
< span class = "filename" > 文件名: poem.txt</ span >
```text
{{#include ../listings/ch12-an-io-project/listing-12-03/poem.txt}}
```
< span class = "caption" > 示例 12-3: 艾米莉·狄金森的诗 “I’ m nobody! Who are you?”,一个好的测试用例</ span >
创建完这个文件之后,修改 *src/main.rs* 并增加如示例 12-4 所示的打开文件的代码:
< span class = "filename" > 文件名: src/main.rs</ span >
```rust,should_panic,noplayground
{{#rustdoc_include ../listings/ch12-an-io-project/listing-12-04/src/main.rs:here}}
```
<span class="caption">示例 12-4: 读取第二个参数所指定的文件内容</span>
首先,我们增加了一个 `use` 语句来引入标准库中的相关部分:我们需要 `std::fs` 来处理文件。
在 `main` 中新增了一行语句:`fs::read_to_string` 接受 `file_path`,打开文件,接着返回包含其内容的 `std::io::Result<String>`。
在这些代码之后,我们再次增加了临时的 `println!` 打印出读取文件之后 `contents` 的值,这样就可以检查目前为止的程序能否工作。
尝试运行这些代码,随意指定一个字符串作为第一个命令行参数(因为还未实现搜索功能的部分)而将 *poem.txt* 文件将作为第二个参数:
```console
{{#rustdoc_include ../listings/ch12-an-io-project/listing-12-04/output.txt}}
```
好的!代码读取并打印出了文件的内容。虽然它还有一些瑕疵:此时 `main` 函数有着多个职能,通常函数只负责一个功能的话会更简洁并易于维护。另一个问题是没有尽可能的处理错误。虽然我们的程序还很小,这些瑕疵并不是什么大问题,不过随着程序功能的丰富,将会越来越难以用简单的方法修复他们。在开发程序时,及早开始重构是一个最佳实践,因为重构少量代码时要容易的多,所以让我们现在就开始吧。