我希望能够从stdin完全读取,然后获得输入,也是从stdin。我可以读取发送到我的代码的输入,但我不能读取用户输入。有什么方法可以解决这个问题吗?我正在编写分页工具,我正在这样做。
Read incoming
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
sb.WriteString(fmt.Sprintf("%s\n", scanner.Text()))
}
Reading user input
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
下面是从stdin读取然后尝试从输入读取的代码的一部分。当第一次读取stdin时,ReadString('\ n')不等待,并导致零长度字符串。如果读取了ReadString,但从stdin的第一次读取没有使ReadString正确等待。我在第二次调用中得到EOF。我将对此进行研究,看看我能做些什么。
var r = bufio.NewReader(os.Stdin)
var contents string
var err error
contents, err = io.ReadAll(r)
if err != nil {
panic(err)
}
text, err := r.ReadString('\n')
if err != nil {
fmt.Println(err)
}
fmt.Println(txt)
1条答案
按热度按时间mklgxw1f1#
我的代码首先从stdin读取任何输入,我使用cat将文本发送到程序,当我这样做时,我可以从stdin读取输入,但如果我尝试使用reader.readString('\ n')或fmt.Scanln()读取键入的输入,什么也得不到。
你像
cat file.txt | program
一样运行你的程序,然后你输入更多的输入,并试图读取它。程序的stdin通常是从父进程继承的,如果你运行的是交互式环境,那就是从终端(如键盘)输入。
cat file.txt | program
重定向stdin以从cat
的输出读取。Stdin不再从端子指向输入。你必须重新打开一个到终端的流并写入它,你可以通过从
/dev/tty
.tty, err := os.Open("/dev/tty")
阅读来完成。