go语言之文件读写

终端读写

操作终端相关文件操作句柄

终端 名称
os.Stdin 标准输入
os.Stdout 标准输出
os.Stderr 标准错误

如下面将在终端打印出hello world

package main

import(
	"fmt"
	"os"
)

func main() {
	fmt.Fprintf(os.Stdout,"hello world\n")
}
 

文件的读写:

package main

import(
	"fmt"
	"os"
)

func main() {
	fmt.Fprintf(os.Stdin,"hello world\n")

	file,err := os.OpenFile("./1.txt",os.O_CREATE|os.O_WRONLY, 0664)

	if err != nil{
		fmt.Println("open file err", err)
		return
	}

	fmt.Fprintf(file, "write to file")
	file.Close()
}
 

带缓冲区的读

package main

import(
	"fmt"
	"os"
	"bufio"
)
var inputReader *bufio.Reader
var input string
var err error

func main() {
		inputReader = bufio.NewReader(os.Stdin)
		fmt.Println("please input something")
		//注意是‘n’
		input, err = inputReader.ReadString('\n')
		if err == nil{
			fmt.Println("the input is \n",input)
		}
}
 

代码运行结果如下:

[root@launch-wind day09]# go run stdout.go
please input something
 ancuiqahbfcvuqewbafcuqjb  sCDB JKBFCQW
the input is 
  ancuiqahbfcvuqewbafcuqjb  sCDB JKBFCQW

从文件中读

package main

import(
	"fmt"
	"os"
	"bufio"
)
var inputReader *bufio.Reader
var input string
var err error

func main() {
//文件的普通读用Open就可以了,读写用OpenFile
		file,err := os.Open("./1.txt")
		if err != nil{
			fmt.Println("read file faieled")
			return
		}
		defer file.Close()
		inputReader = bufio.NewReader(file)
		
		input, err = inputReader.ReadString('\n')
		if err == nil{
			fmt.Println("the file content is \n",input)
		}
}
 

案例:从文件中读取一行数据,统计之中数字,中午,英文,其他字符的数量。
代码如下:

package main

import(
	"fmt"
	"os"
	"bufio"
	"io"
)
var inputReader *bufio.Reader
var input string
var err error

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

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

		var count CharCount

		inputReader = bufio.NewReader(file)
		
		for{
			str, err := inputReader.ReadString('\n')
			if err == io.EOF{
				break;
			}
			if err != nil{
				fmt.Println("read file failed!")
				break
			}
			//转换成字符数组【】rune  字节数组是【】byte
			run := []rune(str)
			for  _,v := range run{
				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("ch :%d  space :%d num :%d other :%d\n",count.ChCount,count.SpaceCount,count.NumCount,count.OtherCount)
		
		
}
 

运行结果

[root@launch-wind day09]# go run stdout.go
ch :21  space :3 num :5 other :3
[root@launch-wind day09]# cat 1.txt 
write to filer
12345
hello echo

压缩包文件的读取 “compress/gzip”,可以读取压缩文件 gzip.NewReader就可以了


前面讲的都是文件的读取,现在我们讲一下文件的写入。
文件的写入我们使用os.OpenFil("./1.txt", os.O_WRONLY, 0666)

参数 作用
第一个参数 打开的文件
第二个参数 打开的方式
第三个参数 权限控制

第二个参数

参数值 含义
os.O_WRONLY 只写
os.O_CREATE 没有就创建文件
os.O_RDONLY 只读
os.O_RDWR 读写操作
os.O_TRUNC 清空文件操作

带缓冲的文件的写入实例

package main

import(
	"fmt"
	"os"
	"bufio"
)
var inputReader *bufio.Reader
var input string
var err error


func main() {
		file,err := os.OpenFile("./1.txt", os.O_WRONLY, 0666)
		if err != nil{
			fmt.Println("open file faieled")
			return 
		}
		defer file.Close()

		outputWriter := bufio.NewWriter(file)
		str := "hello echo\n"
		for i:=0; i<10; i++{
			outputWriter.WriteString(str)
		}
		//因为是带缓冲区的 所以要有这个函数才能写入磁盘 否则在内存里面
		outputWriter.Flush()
}

拷贝文件 io.Copy(dst,src) 前者实现写的接口,后者实现读的接口。copy函数从源文件读取,然后写入目的文件中去。

猜你喜欢

转载自blog.csdn.net/qq_40477151/article/details/86003712