猿问

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

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


慕的地6264312
浏览 149回答 1
1回答

慕妹3146593

根据 的文档io.ReadFull,它将尝试len(buf)从读者那里准确读取。正如您定义buf的 4 个字节的切片,io.ReadFull将尝试读取 4 个字节,io.ErrUnexpectedEOF如果在读取操作期间遇到 EOF,则返回一个。您可以通过使用Reader.Read(os.Stdin.Read()在这种情况下,作为os.Stdinimplements io.Reader)或通过显式处理io.ErrUnexpectedEOF错误来解决问题。将起作用,因为它最多Reader.Read尝试读取而不是完全读取. len(buf)len(buf)
随时随地看视频慕课网APP

相关分类

Go
我要回答