正确读取用户的输入

我对 Golang 非常陌生,我正在尝试从用户读取输入,这是要以编程方式打开的文件的名称。


我最初尝试过这个:


package main


import (

    "fmt"

    "os"

    "log"

    "io/ioutil"

)


func takeInput() {

    r, _ := os.Getwd()

    fmt.Println("Your working dir:", r)

    fmt.Print("Enter a file: ")

    f, err := bufio.NewReader(os.Stdin).ReadString('\n')

    if err != nil {

        log.Fatal(err)

    }

    s, err := ioutil.ReadFile(string(f))

    if err != nil {

        log.Fatal(err)

    }

    fmt.Println(string(s))

}


func main() {

    takeInput()

}

但不知何故,它总是导致:


$ go run getin.go


Your working dir: /media/DATA/Src

Enter a file: data.txt

2020/07/23 22:21:03 open data.txt

: no such file or directory

exit status 1

我data.txt在当前工作目录中有该文件。


我用谷歌搜索了一下,发现我也可以fmt.Scanln用来接受用户输入,效果很好:


func takeInput() {

    r, _ := os.Getwd()

    fmt.Println("Your working dir:", r)

    var f string

    fmt.Print("Enter a file: ")

    fmt.Scanln(&f)  // what I changed is how input is taken

    s, err := ioutil.ReadFile(string(f))

    if err != nil {

        log.Fatal(err)

    }

    fmt.Println(string(s))

}

$ go run getin.go


Your working dir: /media/DATA/Src

Enter a file: data.txt

100,200,300,445

...

有人可以帮我理解使用bufio.NewReader获取用户输入的问题吗?


慕姐4208626
浏览 75回答 1
1回答

慕雪6442864

根据 ReadString 的文档:ReadString 读取直到输入中第一次出现 delim,返回一个字符串,其中包含直到并包括分隔符的数据。所以第一种方法的问题是文件名末尾包含换行符。使用Scanln,它会读取直到看到换行符,但它不包括输出中的换行符。因此,在获取用户输入后,您可以通过更新代码轻松修剪空格:func takeInput() {    r, _ := os.Getwd()    fmt.Println("Your working dir:", r)    fmt.Print("Enter a file: ")    f, err := bufio.NewReader(os.Stdin).ReadString('\n')    if err != nil {        log.Fatal(err)    }    s, err := ioutil.ReadFile(strings.TrimSpace(f)))  // what needs to be changed    if err != nil {        log.Fatal(err)    }    fmt.Println(string(s))}也不要忘记导入strings包。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go