golang 逐行读取文件

本文介绍了一个使用Go语言实现的简单程序,该程序能够逐行读取文件内容,并通过回调函数处理每一行数据。示例代码展示了如何打开文件、读取每一行并打印出来。

示例代码如下:

package main

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

func ReadLine(fileName string, handler func(string)) error {
    f, err := os.Open(fileName)
    if err != nil {
        return err
    }
    buf := bufio.NewReader(f)
    for {
        line, err := buf.ReadString('\n')
        line = strings.TrimSpace(line)
        handler(line)
        if err != nil {
            if err == io.EOF {
                return nil
            }
            return err
        }
    }
    return nil
}

func Print(line string) {
    fmt.Println(line)
}

func main() {
    ReadLine("test.txt", Print)
}

输出结果:

1
23
3

本文转载自csdn文章:Go语言_Go_Golang 逐行读取文件
感谢原文作者分享

在Go语言中,有多种读取文件的方法: 1. **使用`os.Open`和`io/ioutil.ReadAll`一次性读取整个文件**:Go语言的标准库提供了`os`和`io/ioutil`等包,可使用`os.Open`打开文件,`io/ioutil.ReadAll`读取文件全部内容,示例代码如下: ```go package main import ( "fmt" "io/ioutil" "os" ) func main() { file, err := os.Open("your_file.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() data, err := ioutil.ReadAll(file) if err != nil { fmt.Println("Error reading file:", err) return } fmt.Println(string(data)) } ``` 这种方法适合读取较小的文件,能简单直接地获取文件全部内容[^1]。 2. **使用`os`包的相关方法**:操作文件的相关方法在`$GOROOT/src/os/file.go`文件中,主要函数有`OpenFile()`、`Open()`、`ReadFile()`等。 - `OpenFile()`:是较底层的打开文件方式,可灵活配置打开的文件,例如`Create()`方法就是调用该方法实现文件的新建。 - `Open()`:以只的方式打开一个文件。 - `ReadFile()`:调用`Open()`方法打开文件,循环读取文件内容,返回值是字节数组。示例代码如下: ```go package main import ( "fmt" "os" ) func main() { data, err := os.ReadFile("your_file.txt") if err != nil { fmt.Println("Error reading file:", err) return } fmt.Println(string(data)) } ``` 这里使用`os.ReadFile`直接读取文件内容,若文件不存在会返回错误[^2]。 3. **分块读取文件**:一次性读取整个文件有时不利于内存管理,Golang 提供了分块读取文件的方法,而非整个或逐行读取,避免因一行大小太大导致逐行读取低效。示例代码如下: ```go package main import ( "bufio" "fmt" "io" "log" "os" ) func main() { f, err := os.Open("ilovego.txt") if err != nil { log.Fatal(err) } defer f.Close() reader := bufio.NewReader(f) buf := make([]byte, 16) for { // reading a file upto buffer n, err := reader.Read(buf) if err != nil { if err != io.EOF { log.Fatal(err) } break } fmt.Print(string(buf[0:n])) } fmt.Println() } ``` 该示例中使用`bufio.NewReader`创建一个带缓冲的读取器,每次读取 16 字节的数据,直到文件结束[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值