Đọc một tệp
Bây giờ chúng ta sẽ thêm chức năng để đọc tệp được chỉ định trong đối số
file_path
. Đầu tiên chúng ta cần một tệp mẫu để kiểm tra: chúng ta sẽ sử dụng
một tệp với một lượng nhỏ văn bản trên nhiều dòng với một số từ được lặp lại.
Listing 12-3 có một bài thơ của Emily Dickinson sẽ phù hợp! Tạo một tệp tên là
poem.txt ở cấp gốc của dự án của bạn, và nhập bài thơ "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!
Với văn bản đã sẵn sàng, chỉnh sửa src/main.rs và thêm mã để đọc tệp, như đã hiển thị trong 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}");
}
Đầu tiên, chúng ta đưa một phần liên quan của thư viện chuẩn vào với một câu
lệnh use
: chúng ta cần std::fs
để xử lý tệp.
Trong main
, câu lệnh mới fs::read_to_string
nhận file_path
, mở tệp đó và
trả về một giá trị kiểu std::io::Result<String>
chứa nội dung tệp.
Sau đó, chúng ta lại thêm một câu lệnh println!
tạm thời để in giá trị của
contents
sau khi tệp được đọc, để chúng ta có thể kiểm tra xem chương trình
đang hoạt động tốt đến đâu.
Hãy chạy mã này với bất kỳ chuỗi nào làm đối số dòng lệnh đầu tiên (vì chúng ta chưa triển khai phần tìm kiếm) và tệp poem.txt làm đối số thứ hai:
$ 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!
Tuyệt vời! Mã đã đọc và sau đó in nội dung của tệp. Nhưng mã có một vài khuyết
điểm. Hiện tại, hàm main
có nhiều trách nhiệm: nói chung, các hàm rõ ràng và
dễ bảo trì hơn nếu mỗi hàm chỉ chịu trách nhiệm cho một ý tưởng duy nhất. Vấn đề
khác là chúng ta không xử lý lỗi tốt như chúng ta có thể. Chương trình vẫn còn
nhỏ, nên những khuyết điểm này không phải là vấn đề lớn, nhưng khi chương trình
phát triển, sẽ khó khăn hơn để sửa chúng một cách gọn gàng. Đó là một thực hành
tốt để bắt đầu tái cấu trúc sớm khi phát triển một chương trình vì việc tái cấu
trúc lượng mã nhỏ hơn dễ dàng hơn nhiều. Chúng ta sẽ làm điều đó tiếp theo.