Чтение файла
Теперь добавим возможность читать файл, указанный в аргументе file_path.
Сначала нам нужен пример файла, на котором можно это проверить: используем файл
с небольшим объемом текста на нескольких строках и с несколькими повторяющимися
словами. В листинге 12-3 приведено стихотворение Эмили Дикинсон, которое
хорошо подойдет! Создайте файл с именем 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 и добавьте код для чтения файла, как показано в листинге 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 отвечает за несколько вещей:
обычно функции понятнее и проще поддерживать, если каждая функция отвечает
только за одну идею. Другая проблема в том, что мы обрабатываем ошибки не так
хорошо, как могли бы. Программа пока маленькая, поэтому эти недостатки не
создают большой проблемы, но по мере роста программы их будет труднее исправить
чисто. Хорошая практика – начинать рефакторинг на ранних этапах разработки,
потому что меньшие объемы кода рефакторить намного проще. Этим мы займемся
дальше.