gpt4 book ai didi

go - 如何读取固定数量的字节?

转载 作者:行者123 更新时间:2023-12-01 22:39:21 28 4
gpt4 key购买 nike

// vim: set noexpandtab tabstop=2:

package main

import (
"io"
"os"
"log"
"fmt"
)

func main() {
buf := make([]byte, 4)
for {
n, err := io.ReadFull(os.Stdin, buf)
fmt.Printf("== %d\n", n)
if err == io.EOF {
os.Stdout.Write(buf)
os.Stdout.Write([]byte("\n"))
break
} else if err == nil {
os.Stdout.Write(buf)
os.Stdout.Write([]byte("\n"))
} else {
log.Fatal(err)
}
}
}
我正在尝试上面的代码。我不确定最后一个 io.ReadFull()为什么以 log.Fatal(err)分支结尾。我认为它应该阅读 err == io.EOF分支。有人可以让我知道谁可以读取固定数量的字节,直到文件结尾?谢谢。
$ builtin printf %s {a..z} | go run main.go
== 4
abcd
== 4
efgh
== 4
ijkl
== 4
mnop
== 4
qrst
== 4
uvwx
== 2
2020/06/26 23:40:50 unexpected EOF
exit status 1

最佳答案

按照documention of io.ReadFull ,它将尝试从阅读器中准确读取len(buf)。由于您已将buf定义为4个字节的 slice ,因此io.ReadFull将尝试读取4个字节,如果在读取操作期间遇到EOF,则返回 io.ErrUnexpectedEOF
您可以通过使用 Reader.Read (在这种情况下为os.Stdin.Read(),因为os.Stdin实现io.Reader)来解决问题,也可以通过显式处理io.ErrUnexpectedEOF错误来解决该问题。 Reader.Read将在尝试读取最多 len(buf)而不是确切的len(buf)时起作用。

关于go - 如何读取固定数量的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62605975/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com