Ce face bufio.Reader.ReadString
ReadString citește până întâlnește octetul delim (de obicei '\n') și returnează tot textul, inclusiv delimitatorul. ReadBytes face exact același lucru, dar returnează un []byte nou.
Dacă sursa se termină înainte de delimitator, primești ce s-a citit și eroarea io.EOF. De aceea, la ultimul rând al unui fișier fără \n final, ai text și io.EOF în același timp; prelucrează întâi textul.
Parametri
| Parametru | Descriere |
|---|---|
delim |
Octetul la care se oprește citirea, de exemplu '\n' sau ';'. |
Ce returnează
Textul citit (cu delimitator) și nil; sau textul rămas și io.EOF la final.
Exemple
Exemplul 1: Citire rând cu rând, cu ultimul rând fără \n
package main
import (
"bufio"
"errors"
"fmt"
"io"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("Iași\nCluj\nBrașov"))
for {
rand, err := r.ReadString('\n')
if rand != "" {
fmt.Printf("%q\n", rand)
}
if errors.Is(err, io.EOF) {
break
}
}
}
Rezultat
"Iași\n"
"Cluj\n"
"Brașov"
Exemplul 2: Alt delimitator și ReadBytes
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
r := bufio.NewReader(strings.NewReader("mere;pere;prune"))
a, _ := r.ReadString(';')
b, _ := r.ReadBytes(';')
c, err := r.ReadString(';')
fmt.Printf("%q %q %q %v\n", a, b, c, err)
}
Rezultat
"mere;" "pere;" "prune" EOF
Exemplul 3: Un meniu în consolă
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
in := bufio.NewReader(os.Stdin)
for {
fmt.Print("Comandă (adauga/lista/iesire): ")
linie, err := in.ReadString('\n')
if err != nil {
break
}
switch strings.TrimSpace(linie) {
case "adauga":
fmt.Println("-> produs adăugat")
case "lista":
fmt.Println("-> coș: 1 produs")
case "iesire":
fmt.Println("-> la revedere!")
return
default:
fmt.Println("-> comandă necunoscută")
}
}
}
Ce scrie utilizatorul (intrare)
adauga
lista
zbor
iesire
Rezultat
Comandă (adauga/lista/iesire): -> produs adăugat
Comandă (adauga/lista/iesire): -> coș: 1 produs
Comandă (adauga/lista/iesire): -> comandă necunoscută
Comandă (adauga/lista/iesire): -> la revedere!
Greșeli frecvente
- Compari rezultatul direct:
linie == "da". Linia conține și\n(iar pe Windows\r\n); foloseștestrings.TrimSpace. - Te oprești la
err != nilfără să prelucrezi textul primit. Ultimul rând fără\nse pierde.
Comenzi înrudite
bufio.NewReader: Învelește un io.Reader într-un bufio.Reader, care citește pe blocuri și oferă ReadString, ReadRune, ReadLine.bufio.Reader.ReadLine: Citește un rând fără caracterul de final, la nivel scăzut; rândurile prea lungi vin pe bucăți.bufio.NewScanner: Creează un bufio.Scanner, cel mai simplu mod de a citi un text rând cu rând (sau cuvânt cu cuvânt).