book/src/ch12-02-reading-a-file.md

2.3 KiB
Raw Blame History

Reading a File

Now well add functionality to read the file specified in the filename argument. First, we need a sample file to test it with: well use a file with a small amount of text over multiple lines with some repeated words. Listing 12-3 has an Emily Dickinson poem that will work well! Create a file called poem.txt at the root level of your project, and enter the poem “Im Nobody! Who are you?”

Filename: poem.txt

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

Listing 12-3: A poem by Emily Dickinson makes a good test case

With the text in place, edit src/main.rs and add code to read the file, as shown in Listing 12-4.

Filename: src/main.rs

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

Listing 12-4: Reading the contents of the file specified by the second argument

First, we bring in a relevant part of the standard library with a use statement: we need std::fs to handle files.

In main, the new statement fs::read_to_string takes the filename, opens that file, and returns a std::io::Result<String> of the files contents.

After that, we again add a temporary println! statement that prints the value of contents after the file is read, so we can check that the program is working so far.

Lets run this code with any string as the first command line argument (because we havent implemented the searching part yet) and the poem.txt file as the second argument:

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

Great! The code read and then printed the contents of the file. But the code has a few flaws. At the moment, the main function has multiple responsibilities: generally, functions are clearer and easier to maintain if each function is responsible for only one idea. The other problem is that were not handling errors as well as we could. The program is still small, so these flaws arent a big problem, but as the program grows, it will be harder to fix them cleanly. Its good practice to begin refactoring early on when developing a program, because its much easier to refactor smaller amounts of code. Well do that next.