从std::io::stdin()
读取时,输入会被缓冲,直到遇到EOF
。我希望在线路到达时处理线路,而不是等待一切都被缓冲。
鉴于shell函数bar
每秒运行echo bar
,我会使用bar | thingy
对此进行测试。在我^C
之前,它不会打印任何内容。
以下是我目前正在使用的内容:
use std::io;
use std::io::timer;
use std::time::Duration;
fn main() {
let mut reader = io::stdin();
let interval = Duration::milliseconds(1000);
loop {
match reader.read_line() {
Ok(l) => print!("{}", l),
Err(_) => timer::sleep(interval),
}
}
}
答案 0 :(得分:1)
从std :: io :: stdin()读取时,输入被缓冲直到遇到EOF
为什么这么说?您的代码似乎可以按您的意愿工作。如果我编译并运行它:
$ ./i
hello
hello
goodbye
goodbye
yeah!
yeah!
每一行中的第一行是我在终端输入并按下输入(这是read_line
查找的内容)。第二个是你的程序输出的内容。
Err(_) => timer::sleep(interval)
这是一个坏主意 - 当输入关闭时(例如使用^D
),您的程序不会终止。
修改强>
我创建了一个脚本bar
:
#!/bin/bash
set -eu
i=0
while true; do
echo $i
sleep 1
done
然后运行它:
./bar | ./i
0
0
0
您的计划继续有效。