我对 Golang 非常陌生,我正在尝试从用户读取输入,这是要以编程方式打开的文件的名称。我最初尝试过这个:package mainimport ( "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.goYour working dir: /media/DATA/SrcEnter a file: data.txt2020/07/23 22:21:03 open data.txt: no such file or directoryexit 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.goYour working dir: /media/DATA/SrcEnter a file: data.txt100,200,300,445...有人可以帮我理解使用bufio.NewReader获取用户输入的问题吗?
1 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
根据 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包。
- 1 回答
- 0 关注
- 74 浏览
添加回答
举报
0/150
提交
取消