🌊

【Go言語】コマンドライン引数に指定したファイルの中身を取得する方法

2023/10/25に公開

静的解析への第一歩?

コードの内容が取得できなきゃ話にならんよなということでファイルの内容を取得してターミナルへ出力するコードを書いてみました。

コード

package main

import (
	"fmt"
	"os"
)

func main() {
	//実行時に引数を受け取る
	// ファイル名の指定
	args := os.Args
	// ファイルは一つだけと限定する
	if len(args) != 2 {
		fmt.Println("引数の数が間違っています")
		os.Exit(1)
	}

	fmt.Println("ファイル読み取り処理を開始します")
	// ファイルをOpenする
	f, err := os.Open(args[1])
	// 読み取り時の例外処理
	if err != nil {
		fmt.Println("error")
	}
	// 関数が終了した際に確実に閉じるようにする
	defer f.Close()

	// バイト型スライスの作成
	buf := make([]byte, 1024)
	for {
		// nはバイト数を示す
		n, err := f.Read(buf)
		// バイト数が0になることは、読み取り終了を示す
		if n == 0 {
			break
		}
		// エラーが出ても終了
		if err != nil {
			break
		}
		// バイト型スライスを文字列型に変換してファイルの内容を出力
		fmt.Println(string(buf[:n]))
	}
}

実行

go run main.go sample.txt

args := os.Argsでコマンドで引数を指定できるようにしてある。

f, err := os.Open(args[1])配列番号1番にあるものを引数に入れられファイルの中身が読み取られる。

なんでstring型にキャストしてるの?

n, err := f.Read(buf)でファイルの中身を読み取っているが返っているのはバイト列となっている。string型にキャストすることでバイト列がUTF-8エンコードされて正しく表示されるのである。

キャストしなかった場合このように返ってきている

\app> go run main.go test.txt
ファイル読み取り処理を開始します
[227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 13
1 136 227 129 160 227 129 158 239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 227 129 147 2
27 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 13 10 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 22
7 129 160 227 129 158 239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 227 129 147 227 130 1
40 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 
129 158 239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 13 10 227 129 147 227 130 140 227 1
29 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 
239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131
 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 23
9 188 129 227 129 147 227 130 140 227 129 175 227 131 134 227 130 185 227 131 136 227 129 160 227 129 158 239 188 129 239 188 129]

キャストした場合

\app> go run main.go test.txt
ファイル読み取り処理を開始します
これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!
これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!
これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!これはテストだぞ!!
MidraLab(ミドラボ)

Discussion