use std::io;
use std::io::Write; // <--- bring flush() into scope
fn main() {
println!("I'm picking a number between 1 and 100...");
print!("Enter a number: ");
io::stdout().flush().unwrap();
let mut val = String::new();
io::stdin().read_line(&mut val)
.expect("Error getting guess");
println!("You entered {}", val);
}
3条答案
按热度按时间but5z9lq1#
这比乍看上去要复杂得多。其他答案提到了
print!
宏,但它并不那么简单。你可能需要刷新stdout,因为它可能不会立即写到屏幕上。flush()
是std::io::Write
的一个trait方法,所以它需要在作用域中才能工作(这是一个很容易犯的早期错误)。x0fgdtte2#
您可以改用
print!
macro。Beware:
请注意,默认情况下,stdout通常是行缓冲的,因此可能需要使用
io::stdout().flush()
来确保立即发出输出。w7t8yxp53#
不要使用print/ln!-宏。使用write/ln!-宏。
它更冗长,但是print/ln!在命令行应用程序中使用有问题,它们的输出可能会管道化或重定向到其他应用程序,这是Unix环境的特点。
总是使用相同的(仅一次请求和“缓冲”)标准输出设备,但系统的标准输出设备因管道/重定向而改变。因此,对于每个输出到标准输出,您必须请求当前的标准输出设备(
std::io::stdout()
)。这可以通过write/ln!-宏来完成。所以说print/ln!坏了,多年来一直有一个公开的问题。