Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Структура Scanner: построчное чтение из файла
Структура Scanner
позволяет читать файл построчно. Создать экземпляр структуры можно с помощью функции NewScanner()
из пакета bufio
. Формат функции:
bufio.NewScanner(r io.Reader) *bufio.Scanner
В качестве примера получим строку из потока os.Stdin
(листинг 14.4).
Листинг 14.4. Ввод строки из потока os.Stdin
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println("Введите строку:")
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
txt := scanner.Text()
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
fmt.Println("Вы ввели:", txt)
} else {
fmt.Fprintln(os.Stderr, "Возникла ошибка")
}
}
Структура Scanner
содержит следующие методы:
Scan()
— перемещает сканер к следующему символу перевода строки и возвращает значениеtrue
, если можно прочитать фрагмент с помощью методаText()
илиBytes()
. При остановке сканирования, например, при достижении конца файла, функция вернет значениеfalse
. Формат метода:
(*bufio.Scanner).Scan() bool
Text()
— возвращает фрагмент в виде строки. Перед чтением нужно вызвать методScan()
. Формат метода:
(*bufio.Scanner).Text() string
Пример построчного чтения из потока:
buf := strings.NewReader("Строка1\r\nСтрока2\nСтрока3")
scanner := bufio.NewScanner(buf)
for scanner.Scan() {
fmt.Printf("%q\n", scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
Результат (символы \r\n
и \n
не входят в состав возвращаемого значения):
"Строка1"
"Строка2"
"Строка3"
Bytes()
— возвращает фрагмент в виде байтового слайса. Перед чтением нужно вызвать методScan()
. Формат метода:
(*bufio.Scanner).Bytes() []byte
Пример построчного чтения из потока:
buf := strings.NewReader("Строка1\r\nСтрока2\nСтрока3")
scanner := bufio.NewScanner(buf)
for scanner.Scan() {
fmt.Printf("%q\n", scanner.Bytes())
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
Результат (символы \r\n
и \n
не входят в состав возвращаемого значения):
"Строка1"
"Строка2"
"Строка3"
Err()
— возвращает объект ошибки или значениеnil
, если при сканировании ошибка не возникла. Формат метода:
(*bufio.Scanner).Err() error
Buffer()
— позволяет установить пользовательский буфер. Формат метода:
(*bufio.Scanner).Buffer(buf []byte, max int)
Split()
— устанавливает функцию сканирования. По умолчанию используется функцияScanLines()
. Формат метода:
(*bufio.Scanner).Split(split bufio.SplitFunc)
Можно воспользоваться следующими стандартными функциями:
bufio.ScanLines(data []byte, atEOF bool) (advance int,
token []byte, err error)
bufio.ScanBytes(data []byte, atEOF bool) (advance int,
token []byte, err error)
bufio.ScanRunes(data []byte, atEOF bool) (advance int,
token []byte, err error)
bufio.ScanWords(data []byte, atEOF bool) (advance int,
token []byte, err error)
Пример получения отдельных слов:
buf := strings.NewReader("Слово1 Слово2 Слово3")
scanner := bufio.NewScanner(buf)
scanner.Split(bufio.ScanWords)
for scanner.Scan() {
fmt.Printf("%q\n", scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
Результат (пробельные символы не входят в состав возвращаемого значения):
"Слово1"
"Слово2"
"Слово3"
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов