gpt4 book ai didi

go - 如何从标准输入中按字节读取?

转载 作者:IT王子 更新时间:2023-10-29 01:57:43 32 4
gpt4 key购买 nike

in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout)
for {
c, err := in.ReadByte()
if err == io.EOF {
break
}
out.WriteByte(c)
}

我想从标准输入流中按字节读取。与 Read 方法不同,ReadByte 似乎不返回 io.EOF。如果已读取所有字节,我该如何中断?

最佳答案

这不是 Reader.ReadByte() 的问题实现,也不是 bufio.NewReader() 的实现.

看这个例子来证明:

buf := bytes.NewBufferString("Hello World!\n")
in := bufio.NewReader(buf)
for {
c, err := in.ReadByte()
if err == io.EOF {
break
}
fmt.Print(string(c))
}

运行时,打印上面的内容

Hello World!

并正确终止。

您的问题出在 os.Stdin 上。从中读取特定于其来源。如果它是您的终端,从中读取只会阻塞并且不会报告 io.EOF。请看这个例子来证明这一点:

in := bufio.NewReader(os.Stdin)
for {
fmt.Println("Reading.")
c, err := in.ReadByte()
if err == io.EOF {
break
}
fmt.Print(string(c))
}

它的输出是:

Reading.

什么也没有发生。没有新的迭代,它被阻塞了。现在,如果您输入一行并按 Enter,例如你输入 Go!,输出将是:

Go!
GReading.
oReading.
!Reading.

Reading.

再次等待新的输入。如您所见,每行提供/提供数据。这就是您的终端所做的:当您输入行时,它不会发送到 os.Stdin。一旦你按下 Enter,整行就会被输入并且可以从 os.Stdin 获得。这就是我们看到的:输入的每个字母 Go! 和一个换行符。我们看到每次迭代打印的 Reading. 文本。输入被消耗后,in.ReadByte() 再次被阻塞,等待新的输入。它不报告 io.EOF

现在尝试以下操作:创建一个文件,例如a.txt 并将其编辑为一行:Go! 和一个换行符。现在将此文件作为标准输入提供给您的程序:

go run play.go < a.txt

运行它我们会看到:

Reading.
GReading.
oReading.
!Reading.

Reading.

Reading.

它终止所以它工作!它之所以有效,是因为这次 os.Stdin 的来源不是您的控制台/终端,而是文件的内容,一旦它被使用,就会尝试从 os.Stdin 中读取> 将正确报告 io.EOF

关于go - 如何从标准输入中按字节读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834542/

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