首页 > golang读取stdin的问题

golang读取stdin的问题

最近做一些小工具,遇到了一个这样的问题.

有这样一个需求 我写了一个命令行工具 允许 cat 1.list | ./gobin "do something" 在执行完获取到1.list的内容之后 判断是否要继续,输入yes or no ,现在有问题就是 第二步的判断会默认取 cat 1.lsit的标准输入

       Arrhost,_=ListFile(os.Stdin) 获取cat的内容

判断是否继续

func YesNO(){
        var i string
        here:
        fmt.Printf("Continue (y/n):")
        fmt.Scan(&i)
        switch i {
            case "y": fmt.Println("go on ...")
            case "n" : fmt.Println("exit ...") ; os.Exit(1)
            default : goto here
        }
}

这种需求要怎么做会比较好?谢谢.

写一个简单的例子:

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)

    for {
        line, err := reader.ReadString('\n')
        if err == io.EOF {
            break
        }

        log.Println(line)
        YesNO()
    }
}

func YesNO() {
    var i string
here:
    fmt.Printf("Continue (y/n):")
    fmt.Scan(&i)
    //    reader := bufio.NewReader(os.Stdin)
    switch i {
    case "y":
        fmt.Println("go on ...")
    case "n":
        fmt.Println("exit ...")
        os.Exit(1)
    default:
        goto here
    }
}

执行 cat 1.list 或者 echo "abc" 如果没有YesNO 那么可以正常的打印出来.
如果是添加上YesNo了 ,就是我想读取完文件后,判断是否再继续,这个时候就是无限的循环了.
所以执行的时候小心哦.


多谢依云和felix 已经解决.

采用/dev/tty 但是因为直接读取的内容匹配会有问题,应该是有更多的字符,所以直接取第一个字符就可以.最后还是修复了下判断回车 不然会有bug

func YesNO() {
    userFile := "/dev/tty"
here:
    fmt.Printf("Continue (y/n):")
    fin, err := os.Open(userFile)
    defer fin.Close()
    if err != nil {
        fmt.Println(userFile, err)
        return
    }
    buf := make([]byte, 1024)
    for {
        n, _ := fin.Read(buf)
        if 0 == n || n > 1 {
            break
        }
    }
    switch string(buf[:2]) {
    case "y\n":
        fmt.Println("go on ...")
    case "n\n":
        fmt.Println("exit ...")
        os.Exit(1)
    default:
        goto here
    }
}
【热门文章】
【热门文章】