9

I'm learning Go.

My program should read data from stdin until I enter a line with a single period.

package main

import (

  "os"
  "fmt"
  "bufio"

)

func main(){

  in    := bufio.NewReader(os.Stdin)
  input := ""

  for input != "." {
    input, err := in.ReadString('\n')
    if err != nil {
      panic(err)
    }
  }
}

How I should modify my for loop, to stop the program when I enter a single dot ?

I tried to implement a while loop with the for statement, is there something wrong with my approach, is the condition wrong, or is ReadString messing with my data ?

4

4 に答える 4

18

他の誰かがこの質問に出くわした場合に備えて:

Go 1.1以降、利用可能な入力の行をループするはるかに優れた方法があります。これが、今日のOPの問題に取り組む方法です。

package main

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

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        line := scanner.Text()
        if line == "." {
            break
        }
        fmt.Println(line) // or do something else with line
    }
}

scanner.Text()末尾の改行を自動的に取り除きます。

于 2014-06-18T22:58:53.037 に答える
12

... ReadString は私のデータをいじっていますか?

いいえ、そうではありません。次まで読んでい'\n'ます。つまり、ドットのみの行には、オペレーティング システムに応じてデータが含まれ".\n"ます。".\r\n"

行末を削除するには、次のようにしますinput = strings.TrimRight(input, "\r\n")

于 2013-01-07T22:57:34.950 に答える
1

bufio ヘルパー関数を使用する際の主な問題は、 stop character を超えるデータを読み取る可能性があることです。バッファのサイズまで、利用可能なすべての入力を読み取ります。os.Stdin への同時アクセスの場合、次のリーダーは、その前に bufio によって読み取られた一部の入力を見逃す可能性があります。以下は、 CR charまでのすべての文字を入力ストリームから同時に読み取る安全な方法をスケッチするための、バッファリングされていない「ドラフト」コードです。'\n' ('\n')

package main

import "os"

// echo a line in input to output
// you may add exit signal in copy loop as well
func main() {
    const BUF_SIZE = 128
    in := os.Stdin
    out := os.Stdout
    bufOut := make([]byte, BUF_SIZE)
    n := 0
    for {    // copy loop 
        // non buffered byte-by-byte
        if _, err := in.Read(bufOut[n : n+1]); err != nil {
            break
        }
        if bufOut[n] == 0xa || n == BUF_SIZE { // reached CR or size limit 
            if _, err = out.Write(bufOut[0 : n+1]); err != nil {
                break
            }
            n = 0
        } else {
            n++
        }
    }
}
于 2015-09-21T15:58:50.217 に答える