我想在我的
input.txt
上运行我的 go 文件,当我输入 go run 命令时,我的 go 程序将读取 input.txt
文件,即:
go run goFile.go input.txt
我不想将
input.txt
放入我的 goFile.go
代码中,因为我的 go 文件应该在任何输入名称上运行,而不仅仅是 input.txt
。
我尝试
ioutil.ReadAll(os.Stdin)
,但我需要将命令更改为
go run goFile.go < input.txt
我只使用包
fmt
、os
、bufio
和io/ioutil
。是否可以在没有任何其他包的情况下做到这一点?
io/ioutil
的软件包文档。
ReadFile()
func ReadFile(filename string) ([]byte, error)
使用示例:
func main() {
// First element in os.Args is always the program name,
// So we need at least 2 arguments to have a file name argument.
if len(os.Args) < 2 {
fmt.Println("Missing parameter, provide file name!")
return
}
data, err := ioutil.ReadFile(os.Args[1])
if err != nil {
fmt.Println("Can't read file:", os.Args[1])
panic(err)
}
// data is the file content, you can use it
fmt.Println("File content is:")
fmt.Println(string(data))
}
首先检查提供的参数。如果第一个参数满足输入文件的条件,则使用
ioutil.ReadFile
方法,并提供参数 os.Args
结果。
package main
import (
"fmt"
"os"
"io/ioutil"
)
func main() {
if len(os.Args) < 1 {
fmt.Println("Usage : " + os.Args[0] + " file name")
os.Exit(1)
}
file, err := ioutil.ReadFile(os.Args[1])
if err != nil {
fmt.Println("Cannot read the file")
os.Exit(1)
}
// do something with the file
fmt.Print(string(file))
}
另一种可能性是使用:
f, err := os.Open(os.Args[0])
但是为此,您需要提供要读取的字节长度:
b := make([]byte, 5) // 5 is the length
n, err := f.Read(b)
fmt.Printf("%d bytes: %s\n", n, string(b))
用于通过输入参数(例如 abc.txt)从命令行运行 .go 文件。我们主要需要使用 os、io/ioutil、fmt 包。另外,为了读取命令行参数,我们使用 os.Args 这是示例代码
package main
import (
"fmt"
"os"
"io/ioutil"
)
func main() {
fmt.Println(" Hi guys ('-') ")
input_files := os.Args[1:]
//input_files2 := os.Args[0];
//fmt.Println("if2 : ",input_files2)
if len(input_files) < 1{
fmt.Println("Not detected files.")
}else{
fmt.Println("File_name is : ",input_files[0])
content, err := ioutil.ReadFile(input_files[0])
if err != nil {
fmt.Println("Can't read file :", input_files[0],"Error : ",err)
}else {
fmt.Println("Output file content is(like string type) : \n",string(content))//string Output
fmt.Println("Output file content is(like byte type) : \n",content)//bytes Output
}
}
}
Args 保存命令行参数,包括 Args[0] 形式的命令。 如果 Args 字段为空或 nil,则 Run 使用 {Path}。 在典型使用中,Path 和 Args 都是通过调用 Command 设置的。 参数 [] 字符串 功能。此函数返回字符串类型的数组 https://golang.org/pkg/os/exec/.Args 保存命令行参数,从程序名称开始。在这种情况下,从命令行获取文件名的简短方法是这个函数 os.Args[1:] 。这是输出
elshan_abd$ go run main.go abc.txt
Hi guys ('-')
File_name is : abc.txt
Output file content is(like string type) :
aaa
bbb
ccc
1234
Output file content is(like byte type) :
[97 97 97 10 98 98 98 10 99 99 99 10 49 50 51 52 10]
最后我们需要读取内容文件这个函数
func ReadFile(filename string) ([]byte, error)
来源是https://golang.org/pkg/io/ioutil/#ReadFile
从 Go 1.16 开始,你可以直接使用 os.ReadFile(),如下所示:
func main() {
filename := "string"
byteSlice, err := os.ReadFile(filename)
}
(注意:在这里回答是因为由于声誉限制,我无法对之前的答案发表评论,而且这个问题在谷歌搜索结果中排名靠前)