【问题标题】:Golang dynamic sizing slice when reading a file using buffo.read使用 buffo.read 读取文件时的 Golang 动态大小切片
【发布时间】:2017-11-09 03:27:29
【问题描述】:

我有一个问题,我需要使用 bufio.read 逐行读取 tsv 文件,并且我需要记录每行读取的字节数。

问题是,似乎我不能只初始化一个空切片并将其传递给 bufio.read 并期望切片包含文件的整行。

file, _ := os.Open("file.tsv")

reader := bufio.NewReader(file)

b := make([]byte, 10)
for {
    bytesRead, err:= reader.Read(b)
    fmt.Println(bytesRead, b)
    if err != nil {
        break
    }
}

所以,对于这个例子,由于我指定切片为 10 个字节,所以即使行大于 10 个字节,阅读器也最多读取 10 个字节。

但是:

file, _ := os.Open("file.tsv")

reader := bufio.NewReader(file)

b := byte{} //or var b []byte
for {
    bytesRead, err:= reader.Read(b)
    fmt.Println(bytesRead, b)
    if err != nil {
        break
    }
}

这将始终读取 0 字节,我假设它是因为缓冲区的长度为 0 或容量为 0。

如何逐行读取文件,将整行保存在变量或缓冲区中,并准确返回我已读取的字节数?

谢谢!

【问题讨论】:

    标签: file go io reader


    【解决方案1】:

    如果您想逐行读取,并且正在使用缓冲阅读器,请使用缓冲阅读器的ReadBytes method

    line,err := reader.ReadBytes('\n')
    

    这将为您提供一整行,一次一行,无论字节长度如何。

    【讨论】:

    • 字节数组的长度会等于行的字节数吗?
    • 是的。引用我从我的答案中链接的文档,“ReadBytes 读取直到输入中第一次出现 delim,返回一个包含直到并包括分隔符的数据的切片。”
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多