Faylni o'qish
Endi biz fayl_yoli
argumentida koʻrsatilgan faylni oʻqish funksiyasini qoʻshamiz. Birinchidan, uni sinab ko'rish uchun bizga namuna fayli kerak: biz bir nechta takroriy so'zlar bilan bir nechta satrlarda kichik hajmdagi matnli fayldan foydalanamiz. 12-3 ro'yxatda Olma haqida she'r bor, u yaxshi ishlaydi! Loyihangizning root darajasida olma.txt nomli fayl yarating va “Olma” she’rini kiriting.
Fayl nomi: olma.txt
Tanishaylik, men - olma,
Nomimga quloq solma.
Olaver, ikkilanmay,
Ishtahang bo'lsin karnay
Reklamaga hojat yo'q
Ta'mim rosa yoqimli.
Ortganini quritsang,
Qishda yeysan qoqimni
Men sizlarni olmangiz,
Xomligimda olmangiz!
Asilbekga o'xshab so'ng,
Voy qornim deb qolmangiz!
Bog'larda chiroymanda,
Vitaminga boymanda!
Pishganimda yemasangiz,
Qolasizda armonda!
Matn joyida bo'lgan holda src/main.rs ni tahrirlang va 12-4 ro'yxatda ko'rsatilganidek, faylni o'qish uchun kod qo'shing.
Fayl nomi: src/main.rs
use std::env;
use std::fs;
fn main() {
// --snip--
let args: Vec<String> = env::args().collect();
let sorov = &args[1];
let fayl_yoli = &args[2];
println!("{} qidirilmoqda", sorov);
println!("{} faylida", fayl_yoli);
let tarkib = fs::read_to_string(fayl_yoli)
.expect("Faylni o'qiy olishi kerak edi");
println!("Fayl tarkibi:\n{tarkib}");
}
Birinchidan, biz standart kutubxonaning tegishli qismini use
statementi bilan keltiramiz: fayllar bilan ishlash uchun bizga std::fs
kerak.
main
da yangi fs::read_to_string
statementi fayl_yoli
ni oladi, bu faylni ochadi va fayl mazmunining std::io::Result<String>
ni qaytaradi.
Shundan so'ng, fayl o'qilgandan keyin tarkib
qiymatini chop etadigan vaqtinchalik println!
statementini yana qo'shamiz, shuning uchun dasturning hozirgacha ishlayotganligini tekshirishimiz mumkin.
Keling, ushbu kodni birinchi buyruq qatori argumenti sifatida istalgan qator bilan ishga tushiramiz (chunki biz hali qidiruv qismini amalga oshirmaganmiz) va ikkinchi argument sifatida olma.txt fayli:
$ cargo run -- men olma.txt
Compiling minigrep v0.1.0 (file:///projects/minigrep)
Finished dev [unoptimized + debuginfo] target(s) in 0.0s
Running `target/debug/minigrep the poem.txt`
men qidirilmoqda
olma.txt faylidan
Fayl tarkibi:
Tanishaylik, men - olma,
Nomimga quloq solma.
Olaver, ikiklanmay,
Ishtahang bo'lsin karnay
Reklamaga hojat yo'q
Ta'mim rosa yoqimli.
Ortganini quritsang,
Qishda yeysan qoqimni
Men sizlarni olmangiz,
Xomligimda olmangiz!
Asilbekga o'xshab so'ng,
Voy qornim deb qolmangiz!
Bog'larda chiroymanda,
Vitaminga boymanda!
Pishganimda yemasangiz,
Qolasizda armonda!
Ajoyib! Ushbu kod fayl mazmunini o'qiydi va fayl mazmunini chop etdi. Ammo kodda bir nechta kamchiliklar mavjud. Ayni paytda main
funksiya bir nechta mas'uliyatga ega: umuman olganda, har bir funksiya faqat bitta vazifa uchun javobgar bo'lsa, funksiyalar aniqroq va ularni saqlash osonroq bo'ladi. Boshqa muammo shundaki, biz xatolarni imkon qadar yaxshi hal qilmayapmiz. Dastur hali ham kichik, shuning uchun bu kamchiliklar katta muammo emas, lekin dastur o'sib ulg'aygan sayin ularni toza tuzatish qiyinroq bo'ladi. Dasturni ishlab chiqishda refaktorlashni erta boshlash yaxshi amaliyotdir, chunki kichikroq hajmdagi kodlarni qayta ishlash ancha oson. Biz buni keyin qilamiz.