Golang 如何在 Go 中读取输入文件名

Golang How to read input filename in Go

我想 运行 我的 input.txt 我的 go 文件,当我输入 go 运行 命令时,我的 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

我只使用包 fmtosbufioio/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))

For 运行 .go file from command-line by input parameter like file (例如abc.txt).我们主要需要使用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,运行 使用 {Path}。 在典型使用中,Path 和 Args 都是通过调用 Command 来设置的。 参数 [] 字符串 功能。此函数 return 返回字符串类型 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