Go 如何从stdin中读取字节?
我想从stdin流中读取字节。与Go 如何从stdin中读取字节?,go,byte,buffer,stdin,Go,Byte,Buffer,Stdin,我想从stdin流中读取字节。与Read方法不同,ReadByte似乎不返回io.EOF。如果已读取所有字节,如何中断?这不是实现的问题,也不是实现的问题 请参见此示例以证明这一点: in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout) for { c, err := in.ReadByte() if err == io.EOF { break } out.WriteByt
Read
方法不同,ReadByte
似乎不返回io.EOF
。如果已读取所有字节,如何中断?这不是实现的问题,也不是实现的问题
请参见此示例以证明这一点:
in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout)
for {
c, err := in.ReadByte()
if err == io.EOF {
break
}
out.WriteByte(c)
}
Hello World!
运行时,将打印上述内容
buf := bytes.NewBufferString("Hello World!\n")
in := bufio.NewReader(buf)
for {
c, err := in.ReadByte()
if err == io.EOF {
break
}
fmt.Print(string(c))
}
并正确终止
您的问题在于os.Stdin
。从中阅读是特定于其来源的。如果它是您的终端,从它读取只是阻塞,而不报告io.EOF
。请参见此示例以证明这一点:
in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout)
for {
c, err := in.ReadByte()
if err == io.EOF {
break
}
out.WriteByte(c)
}
Hello World!
其产出是:
in := bufio.NewReader(os.Stdin)
for {
fmt.Println("Reading.")
c, err := in.ReadByte()
if err == io.EOF {
break
}
fmt.Print(string(c))
}
什么也没发生。没有新的迭代,它被阻止了。现在,如果您输入一行并按enter键,例如,您输入Go代码>,输出将为:
Reading.
然后再次等待新的输入。如您所见,每条线路都提供数据。这就是终端的功能:当您输入线路时,它不会发送到os.Stdin
。按Enter键后,整行输入,可从os.Stdin
获得。这就是我们看到的:输入的每个字母Go代码>和换行符。我们可以看到每次迭代打印的文本。消耗输入后,in.ReadByte()
再次被阻止,等待新的输入。它不报告io.EOF
现在尝试以下操作:创建一个文件,例如a.txt
,并将其编辑成一行:Go代码>和换行符。现在将此文件作为标准输入输入到程序:
Go!
GReading.
oReading.
!Reading.
Reading.
它终止了,所以它工作了!它之所以有效,是因为这次os.Stdin
的源不是您的控制台/终端,而是文件的内容,一旦文件被使用,尝试从os.Stdin
读取将正确报告io.EOFReadByte读取并返回单个字节。如果没有可用的字节,则返回一个错误。
read直到出现错误,然后break。所以如果出错!=无{…
。