2017-12-07 9 views
1

同じbufio.Scannerインスタンスを使用してstdinから行と単語を読み込もうとしています。Golangが行を読み取り、同じbufio.Scannerから単語を読み込みます。

最初に2つのbufio.Scannerを使用しようとしましたが、2番目のスキャナは何も読み取れません。

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.Scanを呼び出した後scanner.Splitを呼び出すことはできません。

私は行を読み取ることができる方法がありますし、同じからの単語bufio.Scanner

+2

([例](https://golang.org/pkg/bufio/#example_Scanner_lines)を参照してください) [strings.Fields](https://golang.org/pkg/strings/#Fields)で単語に分割してください。 – Mark

+0

私は実際にこれらの行と単語の間にこのようなシーケンスを維持したいと考えています。この例では、別の 'scanner2.Text()'を実行した場合、次の単語、つまり「行」を取得したいと思います。しかし、私はあなたのポイントを得る、私はちょうどこれを達成するための他の方法があるかどうか調べている。 – srf

+0

ドキュメンテーションのどの部分が、異なるスキャナーで、同じ基礎となるリーダーで作業できることを示唆していますか? – Volker

答えて

1

最初。読者から同じ行を複数回読むことはできません。読者が空になると、読者はそれを読んでいます。そのため、第2のスキャナは何も読むことができません。あなたの例では、strings.Reader no os.Stdinを使用しています。 io.TeeReaderのようなものを使って複製して読者をもっと読むことができますが、これはあなたの場合ではありません。

秒。 scanner.Scanが呼び出された後にscanner.Splitと呼ぶことはできません。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' 
} 
関連する問題