2016-07-26 5 views
0

私は特定の導入ラインは、標準入力から表示された回数を表示したい、次のプログラムを持っている:私はプログラムを実行するとstdinで導入された行の数を表示するにはどうすればよいですか?

package main 

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

func main() { 
    counts := make(map[string]int) 
    input := bufio.NewScanner(os.Stdin) 
    for input.Scan() { 
     counts[input.Text()]++ 
    } 
    // NOTE: ignoring potential errors from input.Err() 
    for line, n := range counts { 
     if n > 1 { 
      fmt.Printf("%d\t%s\n", n, line) 
     } 
    } 
} 

それは私は、文字列を入力することができますが、私は、私ドンをEnterキーを押しても、フィードバックはありません。

私はここで何が欠けていますか?私はそれが最初のforで唖然とすると信じています。

+0

あなたのコンテンツにパイプを入れるか、EOF(^ D)を送信してください。 – Volker

+0

フォルカーあなたのコンテンツにパイプが何を意味しますか? –

+0

Amdの答えを参照してください。 – Volker

答えて

0

これを試してみてください - /tmp/input.txtまたはその他のローカルファイルに次のテキストを保存:

Line A 
Line B 
Line B 
Line A 
Line C 
Line B 

あなたのプログラムへの標準入力として今、パイプ、そのファイルの内容を - たとえばを/ tmp /にq.go: cat /tmp/input.txt | go run /tmp/q.go 出力は次のようになります。

$ cat /tmp/input.txt | go run /tmp/q.go 
2 Line A 
3 Line B 
0

あなたのコードは、第一の端部(EOF)で結果を印刷し、その後、すべての行を取得します。
1 - あなたは、各ラインのためのフィードバックを必要とする場合は、Enterキーを押したとき:あなたがで結果をしたい場合

package main 

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

func main() { 
    counts := make(map[string]int) 
    input := bufio.NewScanner(os.Stdin) 
    for input.Scan() { 
     txt := input.Text() 
     counts[txt]++ 
     fmt.Println("counts[", txt, "] =", counts[txt]) 
    } 
    // NOTE: ignoring potential errors from input.Err() 
    for line, n := range counts { 
     if n > 1 { 
      fmt.Printf("%d\t%s\n", n, line) 
     } 
    } 
} 

2 - :このワーキングサンプルコードのように

for input.Scan() { 
    txt := input.Text() 
    counts[txt]++ 
    fmt.Println("counts[", txt, "] =", counts[txt]) 
} 

:あなたの最初のループを編集
オプションA:ターミナル(コマンドプロンプト)の末尾にあるEOFを押してください:Ctrl + Z、WindowsではEnter、LinuxではCtrl + Dを押します。

オプションB:「lines.txt」のように一つのファイルにすべてのテキストデータを保存し、入力には、このファイルを使用して、外出先のバイナリファイルを実行します(Redirecting input)このように:

のWindows:

main.exe < lines.txt 

のLinux:

./main < lines.txt 
0

あなたは間違っている場所は次のとおりです。

ループを終了するための最初のの条件を指定していません。これにより、Volkerが提案した2つのオプションが残されます。いずれにしても、入力のスキャンをいつ停止するかを知るために、基本的にプログラムにEOFを提供しています。

今、あなたにはそれほどきれいに見えない可能性があります。その場合には(とのみその場合には)、あなたは forループ入力内の終了条件を導入することで進めることができます。

if input.Text() == "" { 
    break; 
} 

これはできるだけ早くループための第二に到達するために、実行につながります2行の改行文字を入力します。あなたがプログラムの初めにユーザーにを入力するように促したいのなら、かなり役に立ちます。などの結果を表示するには、2回押してください。

乾杯!

関連する問題