Golang访问输入文件时遇到错误如何解决

Golang访问输入文件时遇到错误如何解决 我是Go语言新手,为了完成一个编程挑战,我下载了一段代码片段,并阅读了readme.md文件。按照readme.md文件中的说明运行run.bat命令后,生成了一个可执行文件geektrust.exe。但是,当我尝试使用命令go run main.go并附带文件路径./geektrust sample_input/input1.txt来运行代码时,它总是打印错误信息“Error opening the input file”。供您参考,我提供了源代码文件和README.md文件。注意:输入文件的扩展名是.txt,它是一个文本文件。

main.go


package main

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

func main() {
    cliArgs := os.Args[1:]

    if len(cliArgs) == 0 {
        fmt.Println("Please provide the input file path")

        return
    }

    filePath := cliArgs[0]
    file, err := os.Open(filePath)

    if err != nil {
        fmt.Println("Error opening the input file")

        return
    }

    defer file.Close()
    scanner := bufio.NewScanner(file)

    for scanner.Scan() {
        /*
            args := scanner.Text()
            argList := strings.Fields(args)

            Add your code here to process the input commands
        */

    }
}

README.md 文件

前提条件

  • Go 1.15.7/1.16.8/1.17
  • go 工具

如何运行代码

我们提供了执行代码的脚本。

如果您使用的是Linux/Unix/macOS操作系统,请使用run.sh;如果您使用的是Windows,请使用run.bat。这两个文件都会静默运行命令,并且只打印来自输入文件sample_input/input1.txt的输出。您应该根据相应的问题描述在文件中添加输入命令。

这两个脚本在内部运行以下命令:

  • go build . - 这将在$GOPATH/src/geektrust目录中(除了main.go文件之外)构建一个名为geektrust的可执行文件。
  • 使用命令从$GOPATH/src/geektrust目录执行该文件: ./geektrust sample_input/input1.txt

我们希望您的程序将文本文件的位置作为参数。输入需要从文本文件中读取,输出应打印到控制台。文本文件将仅包含相应问题规定的格式的命令。

这个主文件main.go应该接收命令行参数并解析传入的文件。文件解析完毕且应用程序处理完命令后,它应该只打印输出。

运行多个测试用例的代码

请将输入命令填入input1.txtinput2.txt,并在run.batrun.sh中使用这些文件。将./geektrust sample_input/input1.txt替换为./geektrust sample_input/input2.txt以运行第二个文件的测试用例。

如何执行单元测试

单元测试使用库gotestsum运行并计算覆盖率。这与您的解决方案无关,无需添加任何依赖项。但是,这仅在您使用Go Modules进行依赖管理时才有效。

我们从$GOPATH/src/geektrust目录运行以下命令来执行单元测试:

gotestsum --hide-summary=all ./... 我们通过从$GOPATH/src/geektrust目录执行以下命令来检查单元测试的覆盖率:

gotestsum --hide-summary=all -- -coverprofile=cover.out ./...

帮助

您可以在此处参考我们的帮助文档 此处 您可以在此处阅读构建说明 此处


更多关于Golang访问输入文件时遇到错误如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

打印你的 err.Error() 消息来查看失败的原因

更多关于Golang访问输入文件时遇到错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好,欢迎!你确定你的路径是正确的吗?./geektrust sample_input/input1.txt,它是不是缺少一个 /\?路径中的空格必须是 \(带一个空格)。这取决于你如何传递路径。

根据您提供的代码和描述,问题在于文件路径解析。当使用go run main.go ./geektrust sample_input/input1.txt时,程序将./geektrust作为第一个参数(文件路径),而不是sample_input/input1.txt。以下是解决方案:

问题分析

  1. os.Args[1:] 获取命令行参数
  2. 当前命令 go run main.go ./geektrust sample_input/input1.txt 会产生:
    • os.Args[0] = 程序路径
    • os.Args[1] = ./geektrust
    • os.Args[2] = sample_input/input1.txt
  3. 代码只取第一个参数 cliArgs[0],即 ./geektrust,这不是有效的输入文件

正确执行方式

根据README说明,应该先构建可执行文件,然后运行:

# 1. 构建可执行文件
go build -o geektrust.exe main.go

# 2. 使用可执行文件运行
./geektrust.exe sample_input/input1.txt

或者直接使用go run的正确语法:

# 直接运行main.go,只传递输入文件路径
go run main.go sample_input/input1.txt

代码验证

您的代码本身是正确的。以下是验证示例:

// 创建测试文件 test_input.txt
package main

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

func main() {
    // 模拟命令行参数
    os.Args = []string{"program", "test_input.txt"}
    
    cliArgs := os.Args[1:]

    if len(cliArgs) == 0 {
        fmt.Println("Please provide the input file path")
        return
    }

    filePath := cliArgs[0]
    fmt.Printf("Attempting to open: %s\n", filePath)
    
    file, err := os.Open(filePath)
    if err != nil {
        fmt.Printf("Error opening the input file: %v\n", err)
        return
    }

    defer file.Close()
    scanner := bufio.NewScanner(file)

    lineCount := 0
    for scanner.Scan() {
        line := scanner.Text()
        fmt.Printf("Line %d: %s\n", lineCount+1, line)
        lineCount++
    }
    
    if err := scanner.Err(); err != nil {
        fmt.Printf("Error reading file: %v\n", err)
    }
    
    fmt.Printf("Total lines read: %d\n", lineCount)
}

快速测试方法

创建测试文件并运行:

# 创建测试目录和文件
mkdir -p sample_input
echo "test line 1" > sample_input/input1.txt
echo "test line 2" >> sample_input/input1.txt

# 正确运行方式
go run main.go sample_input/input1.txt

输出应该是:

Line 1: test line 1
Line 2: test line 2
Total lines read: 2

如果仍然出现错误,请检查:

  1. 文件路径是否正确(相对路径或绝对路径)
  2. 文件是否存在且有读取权限
  3. 当前工作目录是否正确

可以使用以下代码调试路径问题:

func main() {
    // 打印当前工作目录
    wd, _ := os.Getwd()
    fmt.Printf("Current directory: %s\n", wd)
    
    // 打印所有参数
    fmt.Printf("Arguments: %v\n", os.Args)
    
    // 其余代码...
}
回到顶部