我正在尝试使用相同的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
的单词?
答案 0 :(得分:1)
首先。您无法多次从阅读器读取同一行。一旦读卡器变空,你就会读到它,这就是为什么第二台扫描仪无法读取任何内容。在您的示例中,您使用的是strings.Reader
否os.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'
}