为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕的地6264312 2022-06-13 15:45:21
// vim: set noexpandtab tabstop=2:package mainimport (  "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== 4abcd== 4efgh== 4ijkl== 4mnop== 4qrst== 4uvwx== 22020/06/26 23:40:50 unexpected EOFexit status 1
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

根据 的文档io.ReadFull,它将尝试len(buf)从读者那里准确读取。正如您定义buf的 4 个字节的切片,io.ReadFull将尝试读取 4 个字节,io.ErrUnexpectedEOF如果在读取操作期间遇到 EOF,则返回一个。

您可以通过使用Reader.Reados.Stdin.Read()在这种情况下,作为os.Stdinimplements io.Reader)或通过显式处理io.ErrUnexpectedEOF错误来解决问题。将起作用,因为它最多Reader.Read尝试读取而不是完全读取. len(buf)len(buf)


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号