CodeBlanks Logo Icon CodeBlanks

BufReader

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

main.rs
use std::env;
use std::fs::{self, File};
use std::io::{self, BufRead, BufReader};

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
for satir in BufReader::new(f).____() {
    let satir = satir?;
}
Cevap
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ı

Orta seviye bölümündeki tüm dersler