cpp

Структура 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"

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp