golang不能使用bufio.ReadString {}和ioutil.ReadFile()

时间:2017-06-27 04:55:14

标签: go

如果我尝试通过终端读取文件名,似乎无法找到它。但如果我硬编码它一切正常吗?这不是写出来的问题。

此代码:

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

Appears to work just fine

在不检查错误的情况下运行第一个代码时,会创建一个空白的新文件。然而,即使用相同的函数编写文件来获取新文件名,第二次运行也能完美地运行。

我完全迷失了我在这里做错了什么。这是我的版本信息,如果这有助于让我知道你还需要什么。

go version给了我go version go1.2.1 linux/amd64

1 个答案:

答案 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并升级到新版本通常不是问题。