CodeBlanks Logo Icon CodeBlanks

Özet - Dosya I/O

read_to_string ve write'ı birleştirerek bir log dosyası işleyici yazarsın.

Dosya I/O özeti

Okuma: fs::read_to_string (tamamı), BufReader::lines (satır satır), fs::read (baytlar). Yazma: fs::write (ezer), File::create + writeln!, BufWriter (toplu), OpenOptions ile append. Dizinler: create_dir_all, read_dir, remove_dir_all. Tüm işlemler io::Result döndürür; e.kind() ile hata türü (NotFound, PermissionDenied) ayırt edilir.

Kaydet ve yükle

Not defteri projesinin kalıcılığı için iki küçük fonksiyon yeterlidir:

fn kaydet(yol: &Path, notlar: &[&str]) -> io::Result<()> {
    fs::write(yol, notlar.join("\n"))
}

fn yukle(yol: &Path) -> io::Result<Vec<String>> {
    Ok(fs::read_to_string(yol)?.lines().map(String::from).collect())
}

Bir sonraki adımda düz metin yerine JSON kullanıp yapılı veriyi serde ile saklayacağız.

Uygulama Kalıcı notlar

Yukarıdaki kaydet ve yukle fonksiyonlarını yaz. Geçici klasörde ["süt al", "kod yaz"] notlarını kaydedip geri yükle ve {:?} ile yazdır. Ardından var olmayan bir dosyayı okumayı dene; NotFound ise bulunamadı yazdır.

Başlangıç kodu

main.rs
use std::env;
use std::fs;
use std::io::{self, ErrorKind};
use std::path::Path;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::env;
use std::fs;
use std::io::{self, ErrorKind};
use std::path::Path;

fn kaydet(yol: &Path, notlar: &[&str]) -> io::Result<()> {
    fs::write(yol, notlar.join("\n"))
}

fn yukle(yol: &Path) -> io::Result<Vec<String>> {
    Ok(fs::read_to_string(yol)?.lines().map(String::from).collect())
}

fn main() -> io::Result<()> {
    let yol = env::temp_dir().join("notlar_ders.txt");
    kaydet(&yol, &["süt al", "kod yaz"])?;
    println!("{:?}", yukle(&yol)?);
    match fs::read_to_string(env::temp_dir().join("hic_yok_12345.txt")) {
        Err(e) if e.kind() == ErrorKind::NotFound => println!("bulunamadı"),
        Err(e) => return Err(e),
        Ok(_) => println!("var"),
    }
    Ok(())
}

Beklenen çıktı

["süt al", "kod yaz"]
bulunamadı

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Ayar dosyası yoksa varsayılanlarla devam etmek için hangi kalıp uygundur?

  • Her hatada varsayılan
  • panic!
  • Err(e) if e.kind() == ErrorKind::NotFound => varsayılan Doğru cevap
  • unwrap()

Açıklama: Yalnızca "dosya yok" durumunu yut; izin hatası gibi diğer hatalar kullanıcıya bildirilmeli.

2 Hata türü

Soru
Err(e) if e.____() == ErrorKind::NotFound => Vec::new(),
Cevap
Err(e) if e.kind() == ErrorKind::NotFound => Vec::new(),

Açıklama: io::Error::kind() hatanın türünü verir.

3 Grubun özeti

Kavram Anlamı
read_to_string Tümünü oku
BufReader::lines Satır satır
OpenOptions::append Sona ekle
ErrorKind::NotFound Dosya yok

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