Go语言下的文件读写操作

在Go语言中,文件是使用一个os.File类的对象指针表示的,也可以称这指针为文件句柄(filehandle),os.Stdin和os.Stdout也是属于这个*os.File类型的。

下面举例说明

package main

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

func main() {
    inputFile, inputError := os.Open(os.Args[1])//变量指向os.Open打开的文件时生成的文件句柄
    if inputError != nil {
        fmt.Printf("An error occurred on opening the inputfile\n")
        return
    }
    defer inputFile.Close()

    inputReader := bufio.NewReader(inputFile)
    lineCounter := 0
    for {
        inputString, readerError := inputReader.ReadString(‘\n‘)
        //inputString, readerError := inputReader.ReadBytes(‘\n‘)             if readerError == io.EOF {
            return
        }
        lineCounter++
        fmt.Printf("%d : %s", lineCounter, inputString)
    }
}

上例中的的inputFile是一个*os.File的类型变量,它指向一个打开的文件描述符(文件句柄)。os.Open函数接受一个文件名作为参数,上例中使用的是os.Args[1]的命令行里的第一个参数,os.Args[0]指程序本身。 使用os.Open打开的文件为只读模式,另外一个函数OpenFile(name string, flag int, perm FileMode) (file *File, err error) 指代更多的操作模式。当要打开的文件不存在或程序没有足够权限时,会报错。defer.Close()函数的作用是为了保证程序结束前,这个被打开的文件能为关闭。关键字defer具有延迟执行功能。通过bufio.NewReader(inputFile),我们获得一个带缓冲的reader。之所以转换为使用bufio包里的reader(或者writer),是因为这样我们就可以使用一些实用的高级别的字符串对象,而不是底层原始的bytes数据。接着,使用ReadString(‘\n‘)或者ReadBytes(‘\n‘)方法无限循环一行行地读文件内容,值得注意的是,无论是unix系统还是windows系统,ReadString、ReadBytes还有ReadLine都能通过‘\n‘识别为换行。当我们读取文件直到文件结束时,readerError !=nil (readerError==io.EOF),这个for 循环便结束了。

这里还有一些可代替的方法

1、可以以字符串(字节串)方式一次性读一个完整文件的内容,io/ioutil包里的ioutil.ReadFile() 实现这个功能,它返回一个它所读到的字节的[]byte 数组及nil,或者其它错误,类似地ioutil.WriteFile则将一个[]byte 写到一个文件里去。

两个函数的原型

func ReadFile(filename string) ([]byte, error)

func WriteFile(filename string, data []byte, perm os.FileMode) error

package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    inputFile := os.Args[1]
    outputFile := os.Args[2]
    buf, err := ioutil.ReadFile(inputFile)
    if err != nil {
        fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
    }
    fmt.Printf("%s\n", string(buf))
    err = ioutil.WriteFile(outputFile, buf, 0x644)
    if err != nil {
        panic(err.Error())
    }

}

2、带缓冲的读文件,除了使用ReadString(),一些情况下我们并不是一行行地读文件或二进行文件,我们可以用bufio.Reader的Read()方法,方式如下

buf := make([]byte,1024)   //

...

n,err := inputReader.Read(buf)

if(n==0){break} //n为实际所读到的byte数,当文件的字节数少于缓冲数组的长度时,会返回实际的字节数,

package main

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

func main() {

    inputFile, inputError := os.Open(os.Args[1])
    if inputError != nil {
        fmt.Fprintf(os.Stderr, "File Error: %s\n", inputError)
    }
    fileReader := bufio.NewReader(inputFile)
    counter := 0
    for {
        buf := make([]byte, 1024)
        n, _ := fileReader.Read(buf)
        counter++
        //fmt.Printf("%d,%s", n, string(buf))
        if n == 0 {
            break
        }
        //fmt.Println(n, buf)

        fmt.Printf("%d,%s", n, string(buf))
        fmt.Printf("/////////////////\n")
    }
    fmt.Println(counter)
}

3 、从文件中读列数据。如果文件是以空格分隔的列数据,则可以使用fmt包里的Fscan系列函数,下面的例子使用了这种方式,它将从列中的读到的数据赋值到变量v1,v2和V3,然后追加到一个数组切片去。

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open(os.Args[1])
    if err != nil {
        panic(err)
    }
    var col1, col2, col3 []string
    for {
        var v1, v2, v3 string
        _, err := fmt.Fscanln(file, &v1, &v2, &v3)//Fscanln 将一次只读一行,并将每列的数据赋值给相应的变量
        if err != nil {
            break
        }
        col1 = append(col1, v1)
        col2 = append(col2, v2)
        col3 = append(col3, v3)
    }
    fmt.Println(col1)
    fmt.Println(col2)
    fmt.Println(col3)
}

要读的文件内容为

a1 a2 a3

b1 b2 b3

c1 c2 c3

输出为

[a1 b1 c1]

[a2 b2 c2]

[a3 b3 c3]

备注: path包下有个子包filepath,它提供了些跨平台的处理文件路径及文件名的函数,例如filepath.Base(path)返回文件路径的最后一个元素。

import "path/filepath"

filename := filepath.Base(path)

时间: 2024-11-05 18:52:41

Go语言下的文件读写操作的相关文章

C语言文件读写操作,从文件读取数据

很早写的在linux系统下的文件读写操作,从文件中读取数据 #include <stdio.h> int ReadInfoFromFile(const char *strFile) { FILE *fp; char ch; fp = fopen(strFile, "r"); // 只读的方式打开文件 if(fp==NULL) { perror("fopen"); // 打开文件失败 打印错误信息 return -1; } ch = fgetc(fp);

C语言文件读写操作,写入数据到文件

很早写的在linux系统下的文件读写操作,写入数据到文件,很时候初学者学习 #include <stdio.h> int writeInfoToFile(const char *strFile) { int age, i; char name[10]; FILE *fp; fp = fopen(strFile, "w"); // 只读的方式打开文件 if(fp == NULL) { perror("fopen"); // 文件打开失败,打印错误信息 re

C文件读写操作

C语言的文件 一.文件基本操作:        在c语言中,对数据文件的操作都是依靠文件类型指针来完成. 1.文件类型指针的定义方式:FILE *文件类型变量 2.调用fopen函数打开文件的方法: 文件类型指针变量=fopen(文件名,使用文件打开方式): 文件打开方式(12种) 文件打开方式 意义 rt 只读打开一个文本文件,只允许读数据 wt 只写打开或建立一个文本文件,只允许写数据 at 追加打开一个文本文件,并在文件末尾写数据 rb 只读打开一个二进制文件,只允许读数据 wb 只写打开

【python学习笔记】pthon3.x中的文件读写操作

在学习python文件读写的时候,因为教程是针对python2的,而使用的是python3.想要利用file类时,类库里找不到,重装了python2还是使不了.在别人园子认真拜读了<详解python2和python3区别>(已收藏)之后,才发现python3已经去掉file类. 现在利用python进行文件读写的方法更加类似于C语言的文件读写操作. 如今总结如下: 一 打开文件—— f = open('poem.txt','x+'): 读过open的帮助文档,然后自己翻译了一下,现给大家分享一

Android数据存储——文件读写操作(File)

Android文件读写操作 一.文件的基本操作 Android中可以在设备本身的存储设备或外接的存储设备中创建用于保存数据的文件.在默认状态下,文件是不能在不同程序间共享的. 当用户卸载您的应用程序时,这些文件删除. 文件存储数据可以通过openFileOutput方法打开一个文件(如果这个)文件不存在就自动创建这个文件),通过load方法来获取文件中的 数据,通过deleteFile方法删除一个指定的文件. 1,常用方法介绍: File是通过FileInputStream和FileOutput

Win环境下的文件读写

在win环境下,有许多方法可以对文件进行读写操作,如MFC 中的CFile类,及一些开源的项目如QT中的QFile.开源的好得是可以多平台,而MFC只是微软自家的东西,对于想写跨平台的人,最好不用MFC. 最近在写开发时,突然碰到了一个问题,也是与读写文件有关,不过用的是C的方法,而不是C++,问题的表现是用C 中的Open创建的文件都是只读的,平常很少用这个方法所在网上找了下,才发现这个函数还有一个权限参数,默认是只读.现将C方式下的两种文件操作归纳下 open比起fopen是更低级别的IO操

QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写

版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写     本文地址:http://techieliang.com/2017/12/714/ 文章目录 1. 介绍  1.1. QXml-Token标记类型  1.2. 范例xml文件 2. 写xml 3. 读xml  3.1. 其他 1. 介绍 帮助文档:QXmlStreamReader.QXmlStr

java文件读写操作类

借鉴了项目以前的文件写入功能,实现了对文件读写操作的封装 仅仅需要在读写方法传入路径即可(可以是绝对或相对路径) 以后使用时,可以在此基础上改进,比如: 写操作: 1,对java GUI中文本框中的内容进行捕获,放在txt文本文档中 2,对各种类型数据都以字符串的形式逐行写入 3,对全局数组的内容进行写入 读操作: 获取文件行数 对逐行字符串型数据进行类型转换,放入二维数组中 为后面算法处理提供入口,但是要小心的是:不可以将行数用全局变量做计数器,否则每次读入是全局变量累加出错,应重新开始读取

php学习基础-文件系统(二) 文件读写操作、文件资源处理

一.文件的打开与关闭 /* *读取文件中的内容 * file_get_contents(); //php5以上 * file() * readfile(); * * 不足:全部读取, 不能读取部分,也不能指定的区域 * * fopen() * fread() * fgetc() * fgets() * * * * * 写入文件 * file_put_contents("URL", "内容字符串"); //php5以上 * 如果文件不存在,则创建,并写入内容 * 如果