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.txt和input2.txt,并在run.bat或run.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
打印你的 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。以下是解决方案:
问题分析
os.Args[1:]获取命令行参数- 当前命令
go run main.go ./geektrust sample_input/input1.txt会产生:os.Args[0]= 程序路径os.Args[1]=./geektrustos.Args[2]=sample_input/input1.txt
- 代码只取第一个参数
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
如果仍然出现错误,请检查:
- 文件路径是否正确(相对路径或绝对路径)
- 文件是否存在且有读取权限
- 当前工作目录是否正确
可以使用以下代码调试路径问题:
func main() {
// 打印当前工作目录
wd, _ := os.Getwd()
fmt.Printf("Current directory: %s\n", wd)
// 打印所有参数
fmt.Printf("Arguments: %v\n", os.Args)
// 其余代码...
}

