Golang как читать входное имя файла в Go

я хотел бы запустить мой файл go на моем input.txt где моя программа go будет читать input.txt файл при вводе команды go run ie:

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. Можно ли это сделать без каких-либо других пакеты?

3 ответов


пожалуйста, взгляните на документацию пакета 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))
}

Firs вы проверяете для предоставленного аргумента. Если первый аргумент удовлетворяет условию входного файла, то вы используете 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.)Нам нужно использовать в основном 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 пусто или равно нулю, Run использует {Path}. В типичном использовании и путь, и Args устанавливаются путем вызова команды. Параметр args []строка функция. Эта функция возвращает обратно массив на строковый тип https://golang.org/pkg/os/exec/.Args содержит аргументы командной строки, начиная с имени программы. В этом случае короткий способ взять имя файла из командной строки-это functions 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