从stdin读取行直到某个字符

时间:2013-01-07 22:37:42

标签: go

我正在学习Go。

我的程序应该从stdin读取数据,直到我输入一个句号的行。

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

我应该如何修改for循环,以便在输入单个点时停止程序?

我尝试使用for语句实现while循环,我的方法有问题,条件错误,还是ReadString弄乱了我的数据?

3 个答案:

答案 0 :(得分:14)

以防万一其他人遇到这个问题:

从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()会自动删除尾随换行符。

答案 1 :(得分:11)

  

...是ReadString弄乱我的数据吗?

不,不是。它正在阅读下一个'\n'。这意味着,只有一个点的行将包含数据".\n"".\r\n",具体取决于操作系统。

要删除行结尾,我会input = strings.TrimRight(input, "\r\n")

答案 2 :(得分:0)

使用任何 bufio帮助函数的主要问题是它可能会读取停止字符if($(this).scrollTop() >= 0 && $(this).scrollTop() < ($('.parent').height() - $('.inner').height())){ //fix the inner div here } else { //unfix it } 之外的更多数据。它读取所有可用的输入,最大可达缓冲区大小。在并发访问os.Stdin的情况下,下一个读者可能会错过bufio之前读取的一些输入。下面是我的非缓冲“草稿”代码,用于绘制并行安全方法,从输入流中读取所有字符,直至 CR '\n' char。

('\n')