文件的创建
os.create(文件名)
文件名可以写路径
返回值为文件指针和err
代码的最后要关闭文件 一定记住
- 绝对路径如d:/ 文件名.文件
直接表示在哪里 - 相对路径..../文件名.文件
一个.表示上一级目录
建议使用
实现代码 创建了名为文件0号的文本文件:
//os.create(文件名) 文件名可以写路径d:/等 绝对路径如d:/ 相对路径./ 一个.表示上一级目录
//返回值为文件指针和err
f,err:=os.Create("文件0号.txt")
if err != nil {
//文件创建失败的原因
//1.路径不存在
//2.文件权限不足
//3.程序打开文件上限
fmt.Println(err)
return
}
//关闭文件 一定记住
//不关闭会造成内存的浪费 程序打开有上限
//f.Close()
defer f.Close()//==f.Close()延迟调用
文件的写入
用到的是三种不同的写入方法
在文本文件的写入方法中 \n并不会换行,因为在windows文本文件中用\r\n来换行
下面代码的前提条件都是上面创建文件中用f接受了文件指针
-
f.WriteString
格式为:WriteString(s string)
f.WriteString("Hello world\r\n")
f.WriteString("奥利给,造它,兄弟们")
-
f.Write
格式为:Write(b []byte)
//另一种写入方法
//slice:=[]byte{'1','a','5','b','e','d'}
//a,err1:=f.Write(slice)
a,err1:=f.Write([]byte("这是被强制转换的一个字符串\r\n"))
if err1 != nil {
fmt.Println("错误原因是",err1)
return
}else{
fmt.Println(a)//打印出切片的长度
}
//这个和上面的效果一样,不过上面的代码输出了两个返回值
f.Write([]byte("这是被强制转换的一个字符串"))
-
f.WriteAt
格式为:WriteAt([]byte类型, 光标位置)
//获取光标流位置
//(起始位置0,结束位置)
//os.SEEK_END代表文件的结尾位置,划了删除线代表以后可能不会使用它,淘汰
//获取文件开头到结尾有多少个字符
//count,_:=f.Seek(0,os.SEEK_END)
count,_:=f.Seek(0,io.SeekEnd)
fmt.Println(count)
//指定位置写入
f.WriteAt([]byte("hello world"),count)
f.WriteAt([]byte("哈ha"),0)
f.WriteAt([]byte("鹤顶红"),30)
打开文件
记得关闭
-
os.open
以只读的方式打开,只能读取文件 -
os.openfile(name(文件名),flag(打开的方式),perm(打开的权限))
多种操作都可以
打开的权限 取0-7 一般为6,7
打开的方式或者模式 有4种
- O_RDONLY只读模式
- O_WRONLY只写模式
- O_RDWR可读写模式
- O_APPEND追加模式
f,err:=os.OpenFile("文件0号.txt",os.O_RDWR,6)
if err != nil {
fmt.Println("打开失败",err)
}
f.WriteString("very good")
f.WriteAt([]byte("12213213"),20)
defer f.Close()
读取文件
文件的读取
f.read
这个应该是比较常用的
还挺绕的
没怎么看懂,以后再来更新
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
func main101() {
f,err:=os.Open("文件0号.txt")
if err != nil {
fmt.Println(err)
}
buf:=make([]byte,10)
//块读取
n,_:=f.Read(buf)
fmt.Println(n) //打印出来是切片的长度
fmt.Println(string(buf[:n])) //打印出来是ascii的值,强制转换类型为string
n,_=f.Read(buf)
fmt.Println(string(buf[:n]))
defer f.Close()
}
func main11111111() {
//将文件的全部内容读取出来,然后存放在切片中
f,err:=os.Open("文件0号.txt")
if err != nil {
fmt.Println(err)
return
}
buf:=make([]byte,10)
for{
n,err:=f.Read(buf)
//io.eof代表文件的结尾
//读取到文件的末尾 返回值是error.New("EOF")
if err == nil {
break
}
fmt.Println(string(buf[:n]))
}
defer f.Close()
}
.ReadString
func main() {
f,err:=os.Open("文件0号.txt")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
r:=bufio.NewReader(f)
for {
str,err2:=r.ReadString('\n')
fmt.Println(str)
if err2 == io.EOF {
break
}
}
.ReadBytes
}
//创建文件的缓冲区
r:=bufio.NewReader(f)
//储存数据的区域
//行读取
//(截取的标志)
//slice,_:=r.ReadBytes('\n')
//fmt.Println(string(slice))//打印出第一行
//slice,_=r.ReadBytes('\n')
//fmt.Println(string(slice))//打印出第二行
//slice,_=r.ReadBytes('\n')
//fmt.Println(string(slice))//打印出第三行
//for{
// buf,err1:=r.ReadBytes('\n')
// fmt.Println(string(buf))
// if err1 != nil {
// if err1==io.EOF{//io.EOF代表文件尾部
// break
// }
// fmt.Println(err1)
// }
//fmt.Println(string(buf))
文件操作案例
上面的内容基本都有使用到
package main
import (
"fmt"
"io"
"os"
)
func main() {
var srcfilename string
var dstfilename string
fmt.Printf("请输入原文件名称:")
fmt.Scan(&srcfilename)
fmt.Printf("请输入目的文件名称:")
fmt.Scan(&dstfilename)
if srcfilename==dstfilename{
fmt.Println("原文件和目的文件不能同名")
return
}
file,err:=os.Create(srcfilename)
if err != nil {
fmt.Println("出错了",err)
return
}
file2,err2:=os.Create(dstfilename)
if err2 != nil {
fmt.Println("出错了2",err2)
return
}
file.WriteString("aaaaaaaaaaaaaaaaaaaaaaaaa\r\n")
file.WriteString("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\n")
file.WriteString("cccccccccccccccccccccccccccccccc\r\n")
file.WriteString("dddddddddddddddddddddddddddddddd\r\n")
file3,err4:=os.OpenFile(srcfilename,os.O_RDWR,7)
if err4 != nil {
fmt.Println("出错了4",err)
}
defer file.Close()
defer file2.Close()
//核心处理 读写操作
buf:=make([]byte,1024*4)//一次能够读取4kb的内容
for {
n,err3:=file3.Read(buf)
if err3 != nil&&err3==io.EOF {
return
}
file2.Write(buf[:n])
}
}