在go中逐字节处理文件

问题描述 投票:-3回答:1

类似于 这个问题,在go中一次一个字节处理一个文件的惯用方法是什么?

换一种方式,下面有没有更好的写法?

file, err := ioutil.ReadFile(filename)
file_string = string(file)
for i, c := range file_string {
    // -snip-
}
file go io character byte
1个回答
3
投票

你是把整个文件作为一个字符串(而不是字节)一次性读取,然后逐个处理(而不是逐个字节)。要从字面上一次读取一个字节的文件(这就是 大概率不是你想要的),你必须做到这一点。

f, err := os.Open("path")
if err != nil {
    panic(err)
}

b := make([]byte, 1)

for err := f.Read(b) {
    if err != nil && !errors.Is(err, io.EOF) {
        fmt.Println(err)
        break
    }

    // process the one byte b[0]

    if err != nil {
        // end of file
        break
    }
}

然而,你更可能想要的是有效地读取文件,并且... ... 处理 一次一个字节。为此,您应该使用一个 缓冲阅读机:

f, err := os.Open("path")
if err != nil {
    panic(err)
}

br := bufio.NewReader(f)

for b,err := br.ReadByte() {
    if err != nil && !errors.Is(err, io.EOF) {
        fmt.Println(err)
        break
    }

    // process the one byte b

    if err != nil {
        // end of file
        break
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.