英文:
Golang How to read input filename in Go
问题
我想在我的input.txt
文件上运行我的go文件,当我输入go run命令时,我的go程序将读取input.txt
文件,即:
go run goFile.go input.txt
我不想在我的goFile.go
代码中放入input.txt
,因为我的go文件应该能够运行任何输入名称,而不仅仅是input.txt
。
我尝试过ioutil.ReadAll(os.Stdin)
,但我需要更改我的命令为:
go run goFile.go < input.txt
我只使用fmt
、os
、bufio
和io/ioutil
包。是否可能在不使用其他包的情况下实现这一点?
英文:
I would like to run my go file on my input.txt
where my go program will read the input.txt
file when I type in go run command ie:
go run goFile.go input.txt
I don't want to put input.txt
in my goFile.go
code since my go file should run on any input name not just input.txt
.
I try ioutil.ReadAll(os.Stdin)
but I need to change my command to
go run goFile.go < input.txt
I only use package fmt
, os
, bufio
and io/ioutil
. Is it possible to do it without any other packages?
答案1
得分: 13
请查看您已经使用的io/ioutil
包的文档。
它有一个专门用于此目的的函数:ReadFile()
func ReadFile(filename string) ([]byte, error)
示例用法:
func main() {
// os.Args的第一个元素始终是程序名称,
// 所以我们至少需要2个参数来作为文件名参数。
if len(os.Args) < 2 {
fmt.Println("缺少参数,请提供文件名!")
return
}
data, err := ioutil.ReadFile(os.Args[1])
if err != nil {
fmt.Println("无法读取文件:", os.Args[1])
panic(err)
}
// data是文件内容,您可以使用它
fmt.Println("文件内容为:")
fmt.Println(string(data))
}
英文:
Please take a look at the package documentation of io/ioutil
which you are already using.
It has a function exactly for this: ReadFile()
func ReadFile(filename string) ([]byte, error)
Example usage:
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))
}
答案2
得分: 1
首先,你检查提供的参数。如果第一个参数满足输入文件的条件,那么你使用ioutil.ReadFile
方法,参数为os.Args
的结果。
package main
import (
"fmt"
"os"
"io/ioutil"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Usage : " + os.Args[0] + " file name")
os.Exit(1)
}
file, err := ioutil.ReadFile(os.Args[1])
if err != nil {
fmt.Println("无法读取文件")
os.Exit(1)
}
// 对文件进行操作
fmt.Print(string(file))
}
另一种可能性是使用:
f, err := os.Open(os.Args[0])
但是对于这种情况,你需要提供要读取的字节数:
b := make([]byte, 5) // 5 是长度
n, err := f.Read(b)
fmt.Printf("%d bytes: %s\n", n, string(b))
英文:
Firs you check for the provided argument. If the first argument satisfy the condition of an input file, then you use the ioutil.ReadFile
method, providing parameter the os.Args
result.
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))
}
Another possibility is to use:
f, err := os.Open(os.Args[0])
but for this you need to provide the bytes lenght to read:
b := make([]byte, 5) // 5 is the length
n, err := f.Read(b)
fmt.Printf("%d bytes: %s\n", n, string(b))
答案3
得分: 0
要在命令行中通过输入参数(例如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:]
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}。在典型用法中,通过调用Command来设置Path和Args。Args []string函数。此函数返回字符串类型的数组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。
英文:
For running .go file from command-line by input parameter like file (for example abc.txt).We need use mainly os, io/ioutil, fmt packages. Additionally for reading command line parameters we use
os.Args Here is example code
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 holds command line arguments, including the command as Args[0].
If the Args field is empty or nil, Run uses {Path}.
In typical use, both Path and Args are set by calling Command.
Args []string
function. This function return back array on string type https://golang.org/pkg/os/exec/.Args hold the command-line arguments, starting with the program name. In this case short way to take filename from command-line is this functions os.Args[1:] . And here is output
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]
Finally we need for reading content file this function
func ReadFile(filename string) ([]byte, error)
source is https://golang.org/pkg/io/ioutil/#ReadFile
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论