如果我尝试通过终端读取文件名,似乎无法找到它。但如果我硬编码它一切正常吗?这不是写出来的问题。
此代码:
package main
import (
"bufio"
"fmt"
"io/ioutil"
"os")
func check(e error) {
if e != nil {
panic(e)
}
}
func getUserInput(message string) (text string){
reader := bufio.NewReader(os.Stdin)
fmt.Println(message)
text, err := reader.ReadString('\n')
check(err)
return text
}
func main() {
input := getUserInput("File to open?")
fmt.Println(input)
dat, err := ioutil.ReadFile(input)
check(err)
fmt.Print("% x \n", dat)
input = getUserInput("File to write?")
d1 := []byte(dat)
e := ioutil.WriteFile(input, d1, 0644)
check(e)
}
收率:
panic: open a.jpg
: no such file or directory
goroutine 1 [running]:
runtime.panic(0x4a36c0, 0xc21001d2a0)
/usr/lib/go/src/pkg/runtime/panic.c:266 +0xb6
main.check(0x7fdcd2e07088, 0xc21001d2a0)
/home/matt/Dropbox/CSE3320/fs_GO/fs.go:17 +0x4f
main.main()
/home/matt/Dropbox/CSE3320/fs_GO/fs.go:35 +0x13e
exit status 2
但这段代码:
package main
import (
"bufio"
"fmt"
"io/ioutil"
"os")
func check(e error) {
if e != nil {
panic(e)
}
}
func getUserInput(message string) (text string){
reader := bufio.NewReader(os.Stdin)
fmt.Println(message)
text, err := reader.ReadString('\n')
check(err)
return text
}
func main() {
//input := getUserInput("File to open?")
//fmt.Println(input)
dat, err := ioutil.ReadFile("a.jpg")
check(err)
//fmt.Print("% x \n", dat)
input := getUserInput("File to write?")
d1 := []byte(dat)
e := ioutil.WriteFile(input, d1, 0644)
check(e)
}
在不检查错误的情况下运行第一个代码时,会创建一个空白的新文件。然而,即使用相同的函数编写文件来获取新文件名,第二次运行也能完美地运行。
我完全迷失了我在这里做错了什么。这是我的版本信息,如果这有助于让我知道你还需要什么。
go version
给了我go version go1.2.1 linux/amd64
。
答案 0 :(得分:6)
问题是文件名以换行符结尾:
panic: open a.jpg
: no such file or directory
应该是:
panic: open a.jpg: no such file or directory
这是因为ReadString()
(强调我的):
读取直到输入中第一次出现delim,返回包含数据的字符串和包括分隔符。
使用input = strings.TrimSpace(input)
删除换行符。
额外提示1:您应该使用fmt.Println(input)
而不是使用fmt.Printf("%#v\n", input)
来调试内容。这将显示空格和不可打印的字符更清晰。
额外提示2:去1.2.1已经很老了;你应该考虑使用更新的版本。 Go is very compatible并升级到新版本通常不是问题。