Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Dosya Okuma

Şimdi, dosya_yolu argümanında belirtilen dosyayı okuma işlevselliği ekleyeceğiz. İlk olarak, test etmek için örnek bir dosyaya ihtiyacımız var: Birkaç tekrarlanan kelime içeren, çok satırlı az miktarda metne sahip bir dosya kullanacağız. Liste 12-3’te işe yarayacak kısa bir şiir var! Projenizin kök dizininde siir.txt adında bir dosya oluşturun ve aşağıdaki dizeleri girin.

Filename: siir.txt
Ne hasta bekler sabahı,
Ne taze ölüyü mezar.
Ne de şeytan, bir günahı,
Seni beklediğim kadar.

Geçti istemem gelmeni,
Yokluğunda buldum seni;
Bırak vehmimde gölgeni
Gelme, artık neye yarar?
Listing 12-3: Kısa bir şiir iyi bir test örneği oluşturur.

Metni yerine yerleştirdikten sonra, src/main.rs dosyasını düzenleyin ve Liste 12-4’te gösterildiği gibi dosyayı okuyacak kodu ekleyin.

Filename: src/main.rs
use std::env;
use std::fs;

fn main() {
    // --snip--
    let argumanlar: Vec<String> = env::args().collect();

    let sorgu = &argumanlar[1];
    let dosya_yolu = &argumanlar[2];

    println!("Aranan: {sorgu}");
    println!("Dosya: {dosya_yolu}");

    let icerik = fs::read_to_string(dosya_yolu).expect("Dosya okunamadı");

    println!("Metin içeriği:\n{icerik}");
}
Listing 12-4: İkinci argüman tarafından belirtilen dosyanın içeriğini okumak

İlk olarak, use ifadesiyle standart kütüphanenin ilgili bir bölümünü dahil ediyoruz: Dosyaları işlemek için std::fs’ye ihtiyacımız var.

main fonksiyonunda, yeni fs::read_to_string ifadesi dosya_yolunu alır, o dosyayı açar ve dosyanın içeriklerini barındıran std::io::Result<String> türünde bir değer döndürür.

Bundan sonra, programın şu ana kadar çalıştığını kontrol edebilmemiz için dosya okunduktan sonra icerik değerini yazdıran geçici bir println! ifadesi daha ekliyoruz.

İlk komut satırı argümanı olarak herhangi bir string (henüz arama kısmını uygulamadığımız için) ve ikinci argüman olarak siir.txt dosyasını kullanarak bu kodu çalıştıralım:

$ cargo run -- mezar siir.txt
   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
     Running `target/debug/minigrep mezar siir.txt`
Aranan: mezar
Dosya: siir.txt
Metin içeriği:
Ne hasta bekler sabahı,
Ne taze ölüyü mezar.
Ne de şeytan, bir günahı,
Seni beklediğim kadar.

Geçti istemem gelmeni,
Yokluğunda buldum seni;
Bırak vehmimde gölgeni
Gelme, artık neye yarar?

Harika! Kod dosyanın içeriğini okudu ve sonra yazdırdı. Fakat kodun birkaç kusuru var. Şu anda main fonksiyonunun birden çok sorumluluğu var: Genel olarak, her fonksiyon yalnızca bir fikirden sorumluysa fonksiyonlar daha net ve bakımı daha kolaydır. Diğer bir sorun ise hataları (errors) elimizden geldiğince iyi yönetmiyor olmamız. Program henüz küçük olduğu için bu kusurlar büyük bir problem değil, ancak program büyüdükçe bunları temiz bir şekilde düzeltmek daha da zorlaşacaktır. Az miktarda kodu yeniden düzenlemek çok daha kolay olduğundan, program geliştirirken yeniden düzenlemeye erken başlamak iyi bir pratiktir. Bunu bir sonraki adımda yapacağız.