九、文本文件处理

1.创建文件

  • GO语言中提供了一个Create( )函数专门创建文件.
  • 该函数在创建文件时,首先会判断要创建的文件是否存在,如果不存在,则创建,如果存在,会先将文件中已有的数据清空。
  • 同时,当文件创建成功后,该文件会默认的打开,所以不用在执行打开操作,可以直接向该文件中写入数据。
package main

import (
	"os"
	"fmt"
)

func CreateFile(path string) {
	f, err := os.Create(path)
	if err != nil {
		fmt.Println("创建文件错误:", err)
		return
	}
	defer f.Close()
}

func main() {
	path := "D:/golang/a.txt"
	CreateFile(path)
}

2.写入数据

func CreateFile(path string) {
	f, err := os.Create(path)
	if err != nil {
		fmt.Println("创建文件错误:", err)
		return
	}
	for i := 1; i <= 10; i++ {
		n, err := f.WriteString("hello world\n")
		fmt.Println(n) //第一个参数返回写入数据的长度;第二个参数返回错误信息
		if err != nil {
			fmt.Println("写入文件错误:", err)
			return
		}
	}
	defer f.Close()
}

func main() {
	path := "D:/golang/a.txt"
	CreateFile(path)
}
  • 使用Write( )函数写数据时,参数为字节数组,所以需要将字符串转换成字节数组。
  • buff := []byte(“hello world”)
  • n, err := f.Write(buff)
  • 使用WriteAt( )函数,在指定的位置写入数据:
  • n,_ := f.seek(0,os.SEEK_END) //查找文件末尾的偏移量
  • a,err := f.WriteAt([]byte(“hello world”),n) //从文件末尾的偏移量开始写入内容
  • 对已经存在的文件不能再执行Create( ),而是要执行OpenFile( ).
    如下所示:
  • f, err := os.OpenFile(path, os.O_APPEND, 6)
  • OpenFile( )这个函数有三个参数,第一个参数表示打开文件的路径
  • 第二个参数表示模式,常见的模式有:
    • O_RDONLY(只读模式)
    • O_WRONLY(只写模式)
    • O_RDWR( 可读可写模式)
    • O_APPEND(追加模式)。
  • 第三个参数,表示权限,取值范围(0-7)表示如下:
    • 0:没有任何权限
    • 1:执行权限(如果是可执行文件,是可以运行的)
    • 2:写权限
    • 3:写权限与执行权限
    • 4:读权限
    • 5:读权限与执行权限
    • 6:读权限与写权限
    • 7:读权限,写权限,执行权限
func AppendFile(path string) {
	f, err := os.OpenFile(path, os.O_APPEND, 6)
	if err != nil {
		fmt.Println("打开文件错误:", err)
		return
	}
	defer f.Close()
	for i := 1; i <= 10; i++ {
		_, err := f.WriteString("hello world\n")
		if err != nil {
			fmt.Println("写入文件错误:", err)
			return
		}
	}
}

func main() {
	path := "D:/golang/a.txt"
	AppendFile(path)
}

3.读取文件

  • Open( )是打开文件,与OpenFile( )的区别是,Open( )只有读的权限
  • Read( )函数返回的是从文件中读取的数据的长度。最后,输出切片中存储的文件数据,注意,读取的是从最开始到整个数据长度,因为有可能存储到切片中的数据达不到切片的总长度(也是切片时2k,但是从文件中读取的数据有可能只有1k)
func ReadFile(path string) {
	f, err := os.Open(path)
	if err != nil {
		fmt.Println("打开文件错误:", err)
		return
	}
	defer f.Close()

	buff := make([]byte, 1024*1024)
	n, err := f.Read(buff)
	if err != nil && err!= io.EOF {
		fmt.Println("读取文件错误:", err)
		return
	}
	fmt.Println(string(buff[:n]))
}

func main() {
	path := "D:/golang/a.txt"
	ReadFile(path)
}
3.1 按行读取
package main

import (
	"os"
	"fmt"
	"bufio"
	"io"
)

func ReadFile(path string) {
	f, err := os.Open(path)
	if err != nil {
		fmt.Println("打开文件错误:", err)
		return
	}
	defer f.Close()
	i := bufio.NewReader(f)
	for {
		//buff, err := i.ReadBytes('\n')  //遇到'\n'就结束
		buff, _, err := i.ReadLine() //按行读取
		if err != nil {
			if err == io.EOF { //文件已经结束
				break
			} else {
				fmt.Println("读取文件错误:", err)
			}
		}
		fmt.Println(string(buff))
	}
}

func main() {
	path := "D:/golang/a.txt"
	ReadFile(path)
}

4.复制文件案例

package main

import (
	"os"
	"fmt"
	"io"
)

func main() {
	//打开源文件
	sf, err1 := os.Open("D:/golang/a.txt")
	if err1 != nil {
		fmt.Println("打开源文件错误:", err1)
		return
	}

	//创建目标文件
	tf, err2 := os.Create("D:/golang/b.txt")
	if err2 != nil {
		fmt.Println("创建目标文件错误:", err2)
		return
	}

	//关闭文件
	defer sf.Close()
	defer tf.Close()

	//复制文件
	buff := make([]byte, 1024*1024)
	for {
		n, err3 := sf.Read(buff) //读一部分
		if err3 != nil {
			if err3 == io.EOF {
				break //文件读取完毕
			} else {
				fmt.Println("读取源文件错误:", err3)
			}
		}
		tf.Write(buff[:n]) //写一部分
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值