BufReader
- Rust kursu
- Orta seviye
- Ders 92/115
- 4 dk
BufReader ile verimli satır satır okuma yaparsın.
BufReader
Büyük dosyaları belleğe tamamen almak yerine satır satır okumak için BufReader ve BufRead::lines kullanılır. Her satır ayrı bir io::Result<String>'tir:
use std::fs::File;
use std::io::{BufRead, BufReader};
let f = File::open("sayilar.txt")?;
for satir in BufReader::new(f).lines() {
let satir = satir?;
println!("{satir}");
}lines() satır sonlarını (\n, \r\n) otomatik atar. BufRead trait'i kapsamda olmalıdır.
Hatalı satırları ayıklamak
Gerçek dosyalarda bazı satırlar bozuk olabilir. Okuma hatasını ? ile, içerik hatasını match ile ayrı ele almak iyi bir alışkanlıktır:
let mut toplam = 0;
let mut hatali = 0;
for satir in BufReader::new(f).lines() {
match satir?.trim().parse::<i32>() {
Ok(n) => toplam += n,
Err(_) => hatali += 1,
}
}Uygulama Satırları topla
Geçici klasörde "3\n5\n x \n7\n" içeren bir dosya yaz. BufReader ile satır satır oku; çevrilebilenleri topla, çevrilemeyenleri say ve toplam 15, hatalı 1 biçiminde yazdır.
Başlangıç kodu
use std::env;
use std::fs::{self, File};
use std::io::{self, BufRead, BufReader};
fn main() {
// buraya yaz
}Örnek çözüm
use std::env;
use std::fs::{self, File};
use std::io::{self, BufRead, BufReader};
fn main() -> io::Result<()> {
let yol = env::temp_dir().join("veri.txt");
fs::write(&yol, "3\n5\n x \n7\n")?;
let f = File::open(&yol)?;
let mut toplam = 0;
let mut hatali = 0;
for s in BufReader::new(f).lines() {
match s?.trim().parse::<i32>() {
Ok(n) => toplam += n,
Err(_) => hatali += 1,
}
}
println!("toplam {}, hatalı {}", toplam, hatali);
Ok(())
}Beklenen çıktı
toplam 15, hatalı 1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>read_to_string</code> yerine <code>BufReader::lines</code> ne zaman tercih edilir?
- Dosya çok büyükse ya da satırlar akış halinde işlenecekse Doğru cevap
- Dosya küçükse
- İkili dosyalarda
- Hiçbir zaman
Açıklama: lines her seferinde tek satırı bellekte tutar; gigabaytlık günlükler bile sabit bellekle işlenebilir.
2 Satır satır
for satir in BufReader::new(f).____() {
let satir = satir?;
}
for satir in BufReader::new(f).lines() {
let satir = satir?;
}
Açıklama: BufRead::lines her satırı io::Result<String> olarak verir.
3 Tür ve görevi
| Kavram | Anlamı |
|---|---|
BufReader<File> |
Tamponlu okuma |
BufRead |
lines() trait'i |
s? |
Okuma hatası |
parse ile match |
İçerik hatası |