2016-07-26 6 views
0

Ich habe folgendes Programm, das ich, wie oft eine bestimmte eingeführte Zeile von stdin erscheint angezeigt werden soll:Wie kann ich die Anzahl der Zeilen drucken, die über die Standardeingabe eingeführt werden?

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) 
     } 
    } 
} 

Wenn ich das Programm ausführen es erlaubt mir Strings zu geben, aber selbst wenn ich drücke ich don eingeben bekomme kein Feedback.

Was fehlt mir hier? Ich glaube, es wird in der ersten for stuked.

+0

Pipe in deinen Inhalt oder sende EOF (^ D). – Volker

+0

Volker was meinst du mit Pipe in deinen Inhalten? –

+0

Siehe Amds Antwort. – Volker

Antwort

0

Versuchen Sie, diese - den folgenden Text in /tmp/input.txt oder andere lokale Datei speichern:

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

Jetzt Rohr der Inhalt dieser Datei als Standardeingabe zu Ihrem Programm - zum Beispiel in/tmp/q.go: cat /tmp/input.txt | go run /tmp/q.go die Ausgabe sollte sein:

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

Ihr Code wird zuerst alle Zeilen, dann gibt das Ergebnis am Ende (EOF).
1 - wenn Sie Feedback für jede Zeile benötigen, wenn Sie die Eingabetaste drücken: bearbeiten Sie Ihre erste Schleife:

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

wie dieser Arbeitsbeispielcode:

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-, wenn Sie das Ergebnis an die wollen Ende der Dateneingabe, haben Sie zwei Optionen:
Option A: Drücken Sie EOF am Ende der Zeilen im Terminal (Eingabeaufforderung): Strg + Z dann in Windows eingeben, oder Strg + D in Linux.

Option B: alle Textdaten in einer Datei wie "lines.txt" speichern und dann mit dieser Datei als Eingabe (Redirecting input) wie diese Ihre Go Binärdatei ausführen:

Fenster:

main.exe < lines.txt 

Linux:

./main < lines.txt 
0

Der Ort, wo du gehst falsch ist:

Sie geben keine Bedingung für die erste für Schleife zu beenden. Damit haben Sie die beiden von Volker vorgeschlagenen Optionen. In jedem Fall geben Sie dem Programm im Wesentlichen eine EOF, damit Sie wissen, wann Sie aufhören müssen, nach Eingaben zu suchen.

Nun, die Chancen stehen Ihnen vielleicht nicht sehr sauber. In diesem Fall (und nur in diesem Fall), können Sie durch die Einführung einer Abbruchbedingung innerhalb des Eingang für Schleife gehen:

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

Dies führt zur Ausführung des zweiten für Schleife zu erreichen, sobald Sie geben zwei neue Zeilen ein. Ganz praktisch, wenn Sie den Benutzer am Anfang des Programms auf auffordern möchten, drücken Sie zweimal die Eingabetaste, um die Ergebnisse anzuzeigen, oder etwas von diesen Arten.

Prost!