file - 在 go 中逐字节处理文件

标签 file go io character byte

类似于 this question ,在go中一次处理一个文件的惯用方法是什么?

换句话说,有没有更好的方法来编写以下内容?

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

最佳答案

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

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
    }
}

但是,您更可能想要的是有效地读取文件,并一次处理一个字节。为此,您应该使用 buffered reader :
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
    }
}

关于file - 在 go 中逐字节处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61528083/

相关文章:

ruby - 寻找在 Ruby 中轻松实现类文件/IO 类的方法

go - 为什么这段代码在 Go 中是 O(n²) 而不是 O(n)?

go - Go 中的内存管理

rust - 使用 std::fs::write 将 Vec<String> 写入文件

父类和子类中文件 I/O 的 C++ 问题

vim - GoImports 取消 html 语法高亮

file - 如何将文件指针传递给不同的函数

c++ - 使用 vsprintf 和文件操作

iOS:刷新所有输出文件

java - 如何使用java在文本文件中的特定列/索引上写入数据