【Go】Go基础(十):文件读写

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/89496583
一、读写数据
1、读取用户的输入

使用fmt 包提供的 Scan 和 Sscan 开头的函数;

* Scanln 扫描来自标准输入的文本,将空格分隔的值依次存放到后续的参数内,直到碰到换行。
* Scanf 与其类似,除了 Scanf 的第一个参数用作格式字符串,用来决定如何读取。
* Sscan 和以 Sscan 开头的函数则是从字符串读取,除此之外,与 Scanf 相同。

bufio 包提供的缓冲读取(buffered reader)来读取数据

inputReader := bufio.NewReader(os.Stdin)
input, err := inputReader.ReadString('\n')
2、读文件

循环读写每一行:

	inputFile, inputError := os.Open("input.dat")
    defer inputFile.Close()

    inputReader := bufio.NewReader(inputFile)
    for {
        inputString, readerError := inputReader.ReadString('\n')
        fmt.Printf("The input was: %s", inputString)
        if readerError == io.EOF {
            return
        }      
    }

说明:

* inputFile 是 *os.File 类型的,表示一个打开文件的描述符(文件句柄);

读取整个文件到一个字符串中:

    buf, err := ioutil.ReadFile(products.txt)
    fmt.Printf("%s\n", string(buf))
    err = ioutil.WriteFile(products_copy.txt, buf, 0644) // oct, not hex

读取指定大小内容到缓冲

	buf := make([]byte, 1024)
	n, err := inputReader.Read(buf)

按列读取文件中的数据
如果数据是按列排列并用空格分隔的,你可以使用 fmt 包提供的以 FScan 开头的一系列函数来读取他们;

	file, err := os.Open("products2.txt")

    var col1, col2, col3 []string
    for {
        var v1, v2, v3 string
        _, err := fmt.Fscanln(file, &v1, &v2, &v3)
        // scans until newline
        if err != nil {
            break
        }
        col1 = append(col1, v1)
        col2 = append(col2, v2)
        col3 = append(col3, v3)
    }

compress包:读取压缩文件

3、写文件:
	outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666)
	defer outputFile.Close()
	outputWriter := bufio.NewWriter(outputFile)
	outputString := "hello world!\n"
	for i:=0; i<10; i++ {
		outputWriter.WriteString(outputString)
	}
	outputWriter.Flush()

标志:

	os.O_RDONLY:只读
	os.O_WRONLY:只写
	os.O_CREATE:创建:如果指定文件不存在,就创建该文件。
	os.O_TRUNC:截断:如果指定文件已存在,就将该文件的长度截为0。
4、文件拷贝:io.Copy
	src, err := os.Open(srcName)
	defer src.Close()

	dst, err := os.Create(dstName)
	defer dst.Close()
	
	io.Copy(dst, src)
5、 从命令行读取参数

os.Args:用来处理一些基本的命令行参数,os.Args[0] 放的是程序本身的名字,os.Args[1:]用来保存变量;

flag 包:
在 flag 包中有一个 Flag 被定义成一个含有如下字段的结构体:

扫描二维码关注公众号,回复: 6180572 查看本文章
	type Flag struct {
		Name     string // name as it appears on command line
		Usage    string // help message
		Value    Value  // value as set
		DefValue string // default value (as text); for usage message
	}

下面的程序 echo.go 模拟了 Unix 的 echo 功能:

package main

import (
	"flag" // command line option parser
	"os"
)

var NewLine = flag.Bool("n", false, "print newline") // echo -n flag, of type *bool

const (
	Space   = " "
	Newline = "\n"
)

func main() {
	flag.PrintDefaults()
	flag.Parse() // Scans the arg list and sets up flags
	var s string = ""
	for i := 0; i < flag.NArg(); i++ {
		if i > 0 {
			s += " "
			if *NewLine { // -n is parsed, flag becomes true
				s += Newline
			}
		}
		s += flag.Arg(i)
	}
	os.Stdout.WriteString(s)
}

相关函数:

* flag.PrintDefaults() 打印 flag 的使用帮助信息
* flag.Parse() 扫描参数列表
* flag.Arg(i) 表示第i个参数,注意:flag.Arg(0) 就是第一个真实的 flag,而不是像 os.Args(0) 放置程序的名字
* flag.Narg() 返回参数的数量
* flag.Bool flag.Int(),flag.Float64(),flag.String(),设置命令行参数
6、 JSON 数据格式

常用函数:

import 	"encoding/json"		//引入包
func Marshal(v interface{}) ([]byte, error)	//序列化
json.MarshalforHTML()		//web 应用中最好使用该函数,将对数据执行HTML转码,可以被安全地嵌在 HTML <script> 标签中
func NewEncoder(w io.Writer) *Encoder	//将数据对象 v 的json编码写入 io.Writer w 中
func Unmarshal(data []byte, v interface{}) error	//反序列化

JSON 与 Go 类型对应如下:

bool 对应 JSON 的 booleans
float64 对应 JSON 的 numbers
string 对应 JSON 的 strings
nil 对应 JSON 的 null
7、Go 中的密码学

hash 包:实现了 adler32、crc32、crc64 和 fnv 校验;
crypto 包:实现了其它的 hash 算法,比如 md4、md5、sha1 等。以及完整地实现了 aes、blowfish、rc4、rsa、xtea 等加密算法。

猜你喜欢

转载自blog.csdn.net/u010168781/article/details/89496583