2016-03-25 40 views
0

我有兩個(或可能更多)的輸入行,我希望程序採取。例如。如何在golang的控制檯中結束`scanner.Scan`循環?

1 2 3 4 
5 6 7 8 

根據官方文檔,使用

for scanner.Scan() { 
} 

會導致無限線進行掃描,直到它到達EOF或錯誤,是將輸入的兩行而不是有其他的功能呢?

+0

難道你不能在兩行後打破循環? – kichik

+0

如果我想要兩條以上的線,該怎麼辦? – Kevin

+0

@Kevin使用一個計數器並隨時中斷嗎? – OneOfOne

回答

2

傳統的最終用戶輸入標準輸入爲空(零長度)。例如,

package main 

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

func main() { 
    snr := bufio.NewScanner(os.Stdin) 
    enter := "Enter a line of data:" 
    for fmt.Println(enter); snr.Scan(); fmt.Println(enter) { 
     line := snr.Text() 
     if len(line) == 0 { 
      break 
     } 
     fields := strings.Fields(line) 
     fmt.Printf("Fields: %q\n", fields) 
    } 
    if err := snr.Err(); err != nil { 
     if err != io.EOF { 
      fmt.Fprintln(os.Stderr, err) 
     } 
    } 
} 

輸出:

$ go run data.go 
Enter a line of data: 
1 2 3 4 
Fields: ["1" "2" "3" "4"] 
Enter a line of data: 
5 6 7 8 
Fields: ["5" "6" "7" "8"] 
Enter a line of data: 

$ 
0

向用戶按 「CTRL + d」,即從端子的信號的EOF,您的上述代碼應工作而沒有任何變化。

0

執行此操作的一種方法是驗證掃描程序是否已到達文件末尾。

var s scanner.Scanner 

    file, _ := os.Open("file.go") // return io.Reader 

    s.Init(file) // needs io.Reader 

    var character rune 
    character = s.Scan() 

    for character != scanner.EOF { 
    // here your code 
    }