Go os.Open无法识别文件名变量,但;“硬编码”;文件名不起作用

Go os.Open无法识别文件名变量,但;“硬编码”;文件名不起作用,go,Go,正如标题所说,我正在尝试读取一个包含19x9个谜题的数独谜题文件。代码如下: package main import ( "bufio" "fmt" "log" "os" ) func check(e error){ if e != nil{ panic(e) } } func main(){ var mFile string var puzzle []string s := bufio.NewRea

正如标题所说,我正在尝试读取一个包含19x9个谜题的数独谜题文件。代码如下:

package main

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

func check(e error){
    if e != nil{
        panic(e)
    }
}

func main(){
    var mFile string
    var puzzle []string

    s := bufio.NewReader(os.Stdin)
    fmt.Println("Please enter file name: ")
    mFile, _ = s.ReadString('\n')

    fmt.Print("Confirm file: " + mFile)

    readFile, err := os.Open(mFile)

    if err != nil{
        log.Fatalf("Failed to open file: %s", err)
    }

    fileScanner := bufio.NewScanner(readFile)
    fileScanner.Split(bufio.ScanLines)

    for fileScanner.Scan() {
        puzzle = append(puzzle, fileScanner.Text())
    }

    readFile.Close()

    for _, eachLine := range puzzle{
        fmt.Println(eachLine)
    }

}
程序要求输入一个文件名,该文件名被接受,第24行:

fmt.Print("Confirm file: " + mFile)
确认文件名已被捕获,但当它将变量传递给os.Open时,它表示该文件不存在。但是,如果我手动编写os.Open(“theFileName.txt”)代码,文件将按预期打开和打印

os.Open无法识别变量和硬编码文件名的原因是什么?

来自:

ReadString一直读取,直到输入中第一次出现delim,返回一个包含数据的字符串,该字符串最多包含分隔符

新行位于
mFile
中。在将其传递给os.Open之前,需要将其剥离。硬编码文件名时,没有包含尾随的新行。

也可以使用fmt.Scan()接受用户的文本输入,只要文件名之间没有空格(新行计为空格)


当答案像
mFile=mFile[:len(mFile)-1]
mFile=strings.TrimSpace(mFile)
package main

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

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {

    var puzzle []string

    var fName string
    fmt.Println("Please enter file name: ")
    _, err := fmt.Scan(&fName)
    if err != nil {
        log.Println(err)
        return
    }

    fmt.Println("Confirm file:" + fName)

    readFile, err := os.Open(fName)

    if err != nil {
        log.Fatalf("Failed to open file: %s", err)
    }

    fileScanner := bufio.NewScanner(readFile)
    fileScanner.Split(bufio.ScanLines)

    for fileScanner.Scan() {
        puzzle = append(puzzle, fileScanner.Text())
    }

    readFile.Close()

    for _, eachLine := range puzzle {
        fmt.Println(eachLine)
    }

}