Golang读取行然后从同一个bufio.Scanner读取单词

时间:2017-12-07 10:13:14

标签: go

我正在尝试使用相同的bufio.Scanner实例从stdin读取一行和单词。

我首先尝试使用两个bufio.Scanner,但第二个扫描仪无法读取任何内容。

package main

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

func main() {
    r := strings.NewReader("first line\n2nd line")
    scanner := bufio.NewScanner(r)
    scanner2 := bufio.NewScanner(r)

    fmt.Println("scanning line")
    if scanner.Scan() {
        fmt.Println("Scanned line: ", scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }

    scanner2.Split(bufio.ScanWords)
    fmt.Println("scanning word")
    if scanner2.Scan() {
        // i'm expecting that this would read "2nd"
        fmt.Println("Scanned word: ", scanner2.Text())
    }

    if err := scanner2.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }
}

然后我尝试设置scanner.Split,但在调用scanner.Split后不允许调用scanner.Scan

有没有办法可以读取一行,然后是同一个bufio.Scanner的单词?

1 个答案:

答案 0 :(得分:1)

首先。您无法多次从阅读器读取同一行。一旦读卡器变空,你就会读到它,这就是为什么第二台扫描仪无法读取任何内容。在您的示例中,您使用的是strings.Readeros.Stdin。您可以使用io.TeeReader之类的内容复制以多次阅读阅读器,但这不是您的情况。

二。在调用scanner.Split后您无法致电scanner.Scan,您需要创建一个以os.Stdin作为输入的新扫描程序。

例如:

// this gonna read from stdin complete lines
scanner := bufio.NewScanner(os.Stdin)

// scanning lines until Q is typed
for scanner.Scan() {
    t := scanner.Text()

    if t == "Q" {
        break
    }
    fmt.Println(scanner.Text())
}

// new scanner to read but this time words
scanner = bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)

for scanner.Scan() {
    fmt.Println(scanner.Text()) // Println will add back the final '\n'
}