go语言文件创建读写操作笔记
package main
import (
"os"
"fmt"
"io"
"bufio"
)
func main(){
//新建文件
fp,err := os.Create("a.txt")
if err!=nil{
//常见错误
/*
1.路劲不存在
2.文件权限问题
3.程序打开文件上线
*/
fmt.Println("文件创建失败")
return
}
//打开文件
//fp.err := os.Open("a.txt") 这种方式只能只读
/*
os.Open 只能只读方式打开
os.OpenFile(打开文件路劲,打开方式,打开权限(0-7))
O_RDONLY(只读模式)
O_WEONLY(只写模式)
O_RDWR(可读可写模式)
O_APPEND(追加模式)
0 : 没有任何权限
1 : 执行权限(如果是可执行文件,是可以运行的)
2 : 写权限
3 : 写权限与执行权限
4 : 读权限
5 : 读权限与执行权限
6 : 读权限与写权限
7 : 读,写,执行
*/
fp,err := os.OpenFile("a.txt",os.O_RDWR,6)
if err != nil {
fmt.Println("打开文件失败")
}
fp.WriteString("hello")
fp.WriteAt([]byte("哼哼哈嘿",25))
/**
写入文件
**/
// ---第一种方式
// windows换行 \r\n
// linux 黄行 \n
//fp.WriteString("hello world\r\n")
//fp.WriteString("性格荷官在线发牌")
// ====第二种方式切片方式
// sliceee := []byte{'h','e','l','l','o'}
// count,err := fp.Write(sliceee) //必须是字符切片
// if err != nil {
// fmt.Println("写入文件失败")
// return
// } else {
// fmt.Println(count)
// }
// ===========第三种方式 获取光标位置
//获取文件起始位置到结束位置有多少个字符
//count,_ := fp.Seek(0.io.SEEK_END) 逐渐被遗弃
count,_ := fp.Seek(0,io.SeekEnd)
fmt.Println(count) //count返回光标在文本里面的位置
//指定位置写入
fp.WriteAt([]byte("hello world"),count) //在光标位置写入hello world
fp.WriteAt([]byte("haha"),0)
fp.WriteAt([]byte("皮仔"),25)
/*
读取文件内容
Read
*/
fp,err := os.Open("a.txt")
if err != nil {
fmt.Println("打开文件失败")
}
//将文件内容读取出来放在切片中
buf := make([]byte,1024 * 2)
// n,_ := fp,Read(buf)
// fmt.Println(string(buf[:n])
for {
n,err := fp.Read(buf) //读取放入buf切片中
//io.EOF文件的末尾
//读取到文件的末尾 返回值 errors.New("EOF")
if err == io.EOF{
break;
}
fmt.Println(string(buf[:n]))
}
//上面是全部读取出来放在切片中,我们也可以每次只读去一行
//创建缓冲区读取内容
r := bufio.NewReader(fp)
//第一种for循环
for {
//遇到\n结束读取 但是\n也读取进入
buf,err1 := r.ReadBytes('\n')
fmt.Println(string(buf))
if err1 != nil {
if err1 == io.EOF{
break
}
fmt.Println(err1)
}
}
//第二种for循环
for {
str,err2 := r.ReadString('\n')
fmt.Println(str)
if err2 == io.EOF {
break
}
}
/*
关闭文件
如果打开文件不关闭,会造成内存浪费,程序打开文件上限
*/
//fp.Close()
//可以延迟调用
defer fp.Close()
}