CodeBlanks Logo Icon CodeBlanks

bufio.Scanner

bufio.Scanner ile satır okumayı öğrenirsin.

bufio.Scanner

bufio.Scanner bir Reader'ı satır satır (ya da kelime kelime) okumanın en kolay yoludur:

sc := bufio.NewScanner(os.Stdin)
for sc.Scan() {
    satir := sc.Text()
    fmt.Println(len(satir))
}
if err := sc.Err(); err != nil {
    log.Fatal(err)
}

Scan false döndüğünde okuma bitmiştir; sebebin hata olup olmadığını Err() söyler (EOF hata sayılmaz).

Bölme fonksiyonları

Scanner neyi "token" sayacağını bir bölme fonksiyonuyla belirler: varsayılan bufio.ScanLines, ayrıca ScanWords, ScanRunes ve ScanBytes vardır.

sc := bufio.NewScanner(strings.NewReader("bir iki üç"))
sc.Split(bufio.ScanWords)
n := 0
for sc.Scan() { n++ }
fmt.Println(n)  // 3

Yazarken de bufio.NewWriter küçük yazımları birleştirir; sonunda Flush() çağırmayı unutma.

Uygulama Satır say

bufio.Scanner ile "elma\narmut\n\nkiraz" metnini satır satır oku; boş olmayan satırları say ve sayıyı yazdır. Döngüden sonra sc.Err()'i kontrol et.

Başlangıç kodu

main.go
package main

import (
    "bufio"
    "fmt"
    "strings"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "bufio"
    "fmt"
    "strings"
)

func main() {
    sc := bufio.NewScanner(strings.NewReader("elma\narmut\n\nkiraz"))
    n := 0
    for sc.Scan() {
        if sc.Text() != "" {
            n++
        }
    }
    if err := sc.Err(); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(n)
}

Beklenen çıktı

3

Soru ve cevaplar

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

1 Scanner varsayılan olarak en fazla kaç baytlık satır okuyabilir?

  • Sınırsız
  • 1 KB
  • 1 MB
  • 64 KB; daha uzunsa bufio.ErrTooLong verir Doğru cevap

Açıklama: Uzun satırlar için sc.Buffer(make([]byte, 0, 1024*1024), 10*1024*1024) ile tampon büyütülür.

2 Kelime kelime

Soru
sc := bufio.NewScanner(r)
sc.Split(bufio.____)
Cevap
sc := bufio.NewScanner(r)
sc.Split(bufio.ScanWords)

Açıklama: ScanWords boşluklarla ayrılmış kelimeleri tek tek döndürür.

3 bufio parçası

Kavram Anlamı
sc.Scan() Sonraki token'a geç
sc.Text() Token'ı string olarak al
sc.Err() Okuma hatası
w.Flush() Tamponu yaz

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