在go中逐字节处理文件

h6my8fg2  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(132)

与这个问题类似,在go中一次一个字节地处理文件的惯用方法是什么?
换句话说,有没有更好的方法来写下面的内容?

file, err := ioutil.ReadFile(filename)
file_string = string(file)
for i, c := range file_string {
    // -snip-
}
l5tcr1uw

l5tcr1uw1#

你要一次把整个文件作为字符串(而不是字节)读取,然后逐个字符串(而不是逐个字节)地处理它。要一次一个字节地读取文件(这很可能不是你想要的),你必须这样做:

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)

// infinite loop
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
    }
}

相关问题