Go知识点之随便记记(六)— 数据读写(标准输入输出,文件,命令行)

  • Post author:
  • Post category:其他


学习资料来自


GitHub – unknwon/the-way-to-go_ZH_CN: 《The Way to Go》中文译本,中文正式名《Go 入门指南》

数据读写(标准输入/出 os.Stdin / os.Stdout :本质是*os.File类型)

1、输入(才发现,学和写了一段时间go,居然连输入都没有好好了解过🤦‍♀️)

1)fmt 包

(1)fmt.Scanln :空格分隔值依次存入后续参数,直至换行

fmt.Scanln(&firstName, &lastName)

(2)fmt.Scanf :与Scanln类似,但第一个参数用于指定输入格式

(3)fmt.Sscanf 和 fmt.Sscanln :与1)2)类似,但不是从标准输入读取,是从给定的字符串读取

2)bufio 包(提供缓冲)

// 键盘读取输入,直到换行
var inputReader *bufio.Reader
var input string
var err error

func main() {
    inputReader = bufio.NewReader(os.Stdin)
    fmt.Println("Please enter some input: ")
    input, err = inputReader.ReadString('\n')
    if err == nil {
        fmt.Printf("The input was: %s\n", input)
    }
}

文件读写(os.File)

1、读文件

1)普通读文件

// 打开文件
inputFile, inputError := os.Open("input.dat") // 默认只读模式打开
// 判断文件是否正确打开
if inputError != nil {
    fmt.Printf("An error occurred on opening the inputfile\n"
                +"Does the file exist?\n"
                +"Have you got access to it?\n")
    return // exit the function on error
}
// defer保证程序结束时,文件关闭
defer inputFile.Close()

// 针对打开的文件,创建读取器
inputReader := bufio.NewReader(inputFile)
for {
    // 按行读取文件
    // ReadString和ReadBytes不需要关心操作系统结束符直接\n,也可用 ReadLine()
    inputString, readerError := inputReader.ReadString('\n')
    fmt.Printf("The input was: %s", inputString)
    // 判断是否读取到文件末尾
    if readerError == io.EOF {
        return
    }      
}

2)完整文件读取到字符串中(io/ioutil包,ioutil.ReadFile()方法)

inputFile := "products.txt"
outputFile := "products_copy.txt"
// buf 为 []byte 类型
buf, err := ioutil.ReadFile(inputFile)
if err != nil {
    fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
}
fmt.Printf("%s\n", string(buf))
// 输出,写入指定文件
err = ioutil.WriteFile(outputFile, buf, 0644) // oct, not hex
if err != nil {
    panic(err.Error())
}

3)二进制文件或内容并不按行划分 :使用 bufio.Reader 中的 Read() 函数

  • 参数:一个,[]byte类型
  • 返回值:两个,读取到的字节数,错误信息

4)按列读取文件

// 将file中的3列数据分别读入 v1,v2和v3
_, err := fmt.Fscanln(file, &v1, &v2, &v3)

5)读取压缩文件:compress 包,支持文件格式 bzip2、flate、gzip、lzw 和 zlib。打开文件后使用 “格式.NewReader(文件符)”,构建缓冲进行读取,格式类似 bufio.NewReader(文件符)

2、写文件

1)缓冲区写文件

// ----------打开文件
outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666)
// 文件权限 ,写文件时不管Win或Unix均使用 0666
// os.O_RDONLY:只读
// os.O_WRONLY:只写
// os.O_CREATE:创建:如果指定文件不存在,就创建该文件。
// os.O_TRUNC:截断:如果指定文件已存在,就将该文件的长度截为 0 。
// ----------创建写入器(缓冲区)对象
outputWriter := bufio.NewWriter(outputFile)
// ----------字符串写入缓冲区
outputWriter.WriteString(outputString)
// 缓冲区内容写入文件
outputWriter.Flush()

2)fmt包中的函数,打开文件outputFile后,将字符串直接写入文件: fmt.Fprintf(outputFile, “Some test data.\n”)

3)其他写入,打开文件outputFile后直接写入:outputFile.WriteString(“hello, world in a file\n”)

3、拷贝文件使用 io 包

// 1)读方式打开源文件 src

// 2)写/创建方式打开目标文件 dst

// 3)执行拷贝
io.Copy(dst, src)

补:

// 根据当前路径获取文件名
import "path/filepath"
filename := filepath.Base(path)

命令行读写

1)os包:string类型的切片变量 os.Args,处理基本命令行参数,程序启动后自动读取命令行输入的参数(类似C++中main的命令行参数数组)

2)flag包

  • flag.PrintDefaults():打印help信息
  • flag.Bool():默认值flase的flag,在命令行出现了第一个参数->flag为true
  • flag.Parse():扫描参数列表+设置flag
  • flag.Narg():返回参数的数量
  • flag.Arg(i):第 i 个参数(flag.Arg(0)放置参数1,os.Args(0)放置程序名)

使用举例

flag.PrintDefaults()
flag.Parse()
var s string = ""
for i := 0; i < flag.NArg(); i++ {
	s += flag.Arg(i)
}
os.Stdout.WriteString(s)



版权声明:本文为weixin_41804479原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。