// 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.Read
(os.Stdin.Read()
在这种情况下,作为os.Stdin
implements io.Reader
)或通过显式处理io.ErrUnexpectedEOF
错误来解决问题。将起作用,因为它最多Reader.Read
尝试读取而不是完全读取. len(buf)
len(buf)
- 1 回答
- 0 关注
- 148 浏览
添加回答
举报
0/150
提交
取消