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.
trpl-zh-cn/src/ch12-02-reading-a-file.md

2.4 KiB

读取文件

ch12-02-reading-a-file.md
commit 02a168ed346042f07010f8b65b4eeed623dd31d1

现在我们要增加读取由 file_path 命令行参数指定的文件的功能。首先,需要一个用来测试的示例文件:我们会用一个拥有多行少量文本且有一些重复单词的文件。示例 12-3 是一首艾米莉·狄金森Emily Dickinson的诗它正适合这个工作在项目根目录创建一个文件 poem.txt,并输入诗 "I'm nobody! Who are you?"

文件名poem.txt

{{#include ../listings/ch12-an-io-project/listing-12-03/poem.txt}}

示例 12-3艾米莉·狄金森的诗 “Im nobody! Who are you?”,一个好的测试用例

创建完这个文件之后,修改 src/main.rs 并增加如示例 12-4 所示的打开文件的代码:

文件名src/main.rs

{{#rustdoc_include ../listings/ch12-an-io-project/listing-12-04/src/main.rs:here}}

示例 12-4读取第二个参数所指定的文件内容

首先,我们增加了一个 use 语句来引入标准库中的相关部分:我们需要 std::fs 来处理文件。

main 中新增了一行语句:fs::read_to_string 接受 file_path,打开文件,接着返回包含其内容的 std::io::Result<String>

在这些代码之后,我们再次增加了临时的 println! 打印出读取文件之后 contents 的值,这样就可以检查目前为止的程序能否工作。

尝试运行这些代码,随意指定一个字符串作为第一个命令行参数(因为还未实现搜索功能的部分)而将 poem.txt 文件将作为第二个参数:

{{#rustdoc_include ../listings/ch12-an-io-project/listing-12-04/output.txt}}

好的!代码读取并打印出了文件的内容。虽然它还有一些瑕疵:此时 main 函数有着多个职能,通常函数只负责一个功能的话会更简洁并易于维护。另一个问题是没有尽可能的处理错误。虽然我们的程序还很小,这些瑕疵并不是什么大问题,不过随着程序功能的丰富,将会越来越难以用简单的方法修复它们。在开发程序时,及早开始重构是一个最佳实践,因为重构少量代码时要容易的多,所以让我们现在就开始吧。