Читання файлу
Тепер ми додамо функціональність для читання файлу, вказаного в аргументі file_path. Спочатку нам потрібен зразок файлу, щоб протестувати це: ми використаємо файл з невеликою кількістю тексту в кількох рядках із деякими повторюваними словами. У Listing 12-3 є вірш Emily Dickinson, який добре підійде! Створіть файл під назвою poem.txt на кореневому рівні вашого проєкту і введіть вірш “I’m Nobody! Who are you?”
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!
Коли текст уже на місці, відредагуйте src/main.rs і додайте код для читання файлу, як показано в Listing 12-4.
use std::env;
use std::fs;
fn main() {
// --snip--
let args: Vec<String> = env::args().collect();
let query = &args[1];
let file_path = &args[2];
println!("Searching for {query}");
println!("In file {file_path}");
let contents = fs::read_to_string(file_path)
.expect("Should have been able to read the file");
println!("With text:\n{contents}");
}
Спочатку ми підключаємо відповідну частину стандартної бібліотеки за допомогою оператора 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 має кілька обов’язків: загалом функції зрозуміліші та їх легше підтримувати, якщо кожна функція відповідає лише за одну ідею. Інша проблема полягає в тому, що ми не обробляємо помилки так добре, як могли б. Програма все ще невелика, тож ці вади не є великою проблемою, але в міру зростання програми їх буде важче акуратно виправляти. Це хороша практика — починати рефакторинг на ранньому етапі під час розробки програми, тому що рефакторити менші обсяги коду набагато легше. Далі ми це зробимо.