go 終端讀寫、文件讀寫


go 終端讀寫

操作終端相關文件句柄常量

  • os.Stdin:標准輸入
  • os.Stdout:標准輸出
  • os.Stderr:標准錯誤輸出

示例:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	str, err := reader.ReadString('\n')
	if err != nil {
		fmt.Println("read string failed, err:", err)
		return
	}

	fmt.Printf("read str succ, ret:%s\n", str)
}

 

go文件讀寫

os.File封裝所有文件相關操作,之前的 os.Stdin, os.Stdout, os.Stderr都是 *os.File

  • 打開一個文件進行讀操作: os.Open(name string) (*File, error)
  • 關閉一個文件:File.Close()

示例:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("C:/test.log")
	if err != nil {
		fmt.Println("read file err:", err)
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file)
	str, err := reader.ReadString('\n')
	if err != nil {
		fmt.Println("read string failed, err:", err)
		return
	}

	fmt.Printf("read str succ, ret:%s\n", str)
}

從終端讀取一行字符串,統計英文、數字、空格以及其他字符的數量。

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

type CharCount struct {
	ChCount    int
	NumCount   int
	SpaceCount int
	OtherCount int
}

func main() {
	file, err := os.Open("C:/test.log")
	if err != nil {
		fmt.Println("read file err:", err)
		return
	}
	defer file.Close()

	var count CharCount

	reader := bufio.NewReader(file)
	for {
		str, err := reader.ReadString('\n')
		if err == io.EOF {
			break
		}
		if err != nil {
			fmt.Printf("read file failed, err:%v", err)
			break
		}

		runeArr := []rune(str)
		for _, v := range runeArr {
			switch {
			case v >= 'a' && v <= 'z':
				fallthrough
			case v >= 'A' && v <= 'Z':
				count.ChCount++
			case v == ' ' || v == '\t':
				count.SpaceCount++
			case v >= '0' && v <= '9':
				count.NumCount++
			default:
				count.OtherCount++
			}
		}

	}

	fmt.Printf("char count:%d\n", count.ChCount)
	fmt.Printf("num count:%d\n", count.NumCount)
	fmt.Printf("space count:%d\n", count.SpaceCount)
	fmt.Printf("other count:%d\n", count.OtherCount)
}

讀取壓縮文件示例

package main

import (
	"bufio"
	"os"
	"fmt"
	"compress/gzip"
)

func main() {
	fName := "E:/wangjian/go/project/src/go_dev/day7/example/test.txt.gz"
	var r *bufio.Reader
	fi, err := os.Open(fName)
	defer fi.Close()
	if err != nil{
		fmt.Fprintf(os.Stderr, "%v, Can't open %s: error: %s\n", os.Args[0], fName, err)
		os.Exit(1)
	}
	fz, err := gzip.NewReader(fi)
	if err != err {
		fmt.Fprintf(os.Stderr, "open gzip failed, err: %s", err)
		return
	}
	r = bufio.NewReader(fz)
	for {
		line, err := r.ReadString('\n')
		if err != nil{
			fmt.Println("Done reading file")
			os.Exit(0)
		}
		fmt.Println(line)
	}
}

 

文件寫入

os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666)

第二個參數:文件打開模式

  • os.O_WRONLY:只寫
  • os.O_CREATE:創建文件
  • os.O_RDONLY:只讀
  • os.O_RDWR:讀寫
  • os.O_TRUNC :清空

第三個參數:權限控制,與Linux上權限控制一樣

  • r ——> 004
  • w——> 002
  • x——> 001

文件寫入示例:

package main

import (
	"os"
	"fmt"
	"bufio"
)

func main() {
	outputFile, outputError := os.OpenFile("E:/wangjian/go/project/src/go_dev/day7/example/test.txt", os.O_WRONLY|os.O_CREATE, 0666)
	if outputError != nil {
		fmt.Println("An error occurred with file creation")
	}
	defer outputFile.Close()
	outputWriter := bufio.NewWriter(outputFile)
	outputString := "Hello World!\n"
	for i := 0; i < 10; i ++ {
		outputWriter.WriteString(outputString)
	}
	outputWriter.Flush()
}

拷貝文件示例:

package main

import (
	"os"
	"io"
	"fmt"
)

func CopyFile(dstName, srcName string)(written int64, err error){
	src, err := os.Open(srcName)
	if err != nil {
		return
	}
	defer src.Close()

	dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
	if err != nil{
		return
	}
	defer dst.Close()

	return io.Copy(dst, src)
}

func main(){
	CopyFile("E:/wangjian/go/project/src/go_dev/day7/example/test2.txt", "E:/wangjian/go/project/src/go_dev/day7/example/test.txt")
	fmt.Println("Copy Done!")
}

ReadLine使用

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	file, err := os.Open("E:/wangjian/go/project/src/go_dev/day7/example/test.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file)
	var line []byte
	for {
		data, prefix, err := reader.ReadLine()
		if err == io.EOF {
			break
		}

		line = append(line, data...)
		if !prefix {
			fmt.Printf("data:%s\n", string(line))
			line = line[:]
		}

	}
} 

 

命令行參數

os.Args是一個string的切片,用來存儲所有的命令行參數

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Printf("len of args:%d\n", len(os.Args))
	for i, v := range os.Args {
		fmt.Printf("args[%d]=%s\n", i, v)
	}
}

flag包的使用,用來解析命令行參數:

package main

import (
	"flag"
	"fmt"
)

func main() {
	var confPath string
	var logLevel int
	flag.StringVar(&confPath, "c", "", "please input conf path")
	flag.IntVar(&logLevel, "d", 10, "please input log level")

	flag.Parse()

	fmt.Println("path:", confPath)
	fmt.Println("log level:", logLevel)
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM