如何在Rust中打印STDOUT并获取STDIN在同一行?

12
println!()print!()可以分别打印带或不带换行符的字符串和变量。此外,stdin()函数提供了从STDIN读取用户输入行的功能(stdin().read_line(&mut string))。
如果连续使用print宏和read_line函数,则应该可以在同一行上输出并输入。然而,当这种情况发生时,这两个操作将以相反的顺序执行(先读取STDIN,然后再打印语句)。
以下是我想要实现的一个示例:
use std::io;

fn main() {
    let mut input = String::new();
    print!("Enter a string >> ");
    io::stdin().read_line(&mut input).expect("Error reading from STDIN");
}

期望的输出结果应该是(STDIN代表用户被要求输入的点,实际上并不会被打印出来):
Enter a string >> STDIN

实际输出结果为:
STDIN
Enter a string >> 

另一方面,println宏不会改变顺序,但仍存在结尾换行符的问题:
Enter a string >> 
STDIN

在Python(3.x)中,这可以通过一行代码完成,因为input函数允许在STDIN提示之前使用字符串参数:variable = input("Output string") 在Rust文档中找不到类似于Python示例的解决方案后,我将任务分成了print宏和read_line函数。

1
你尝试过在print!语句后刷新输出吗?通常情况下,stdout会在换行时被刷新。可以使用stdout().flush();来刷新。 - belst
我没有刷新STDOUT。在进一步阅读文档后,我现在知道当使用print宏时必须手动刷新STDOUT,因为它不会在遇到换行符之前自动刷新。非常感谢您的帮助,@belst!请随意将其发布为答案,我将接受它作为最佳答案。 - computer_geek64
2个回答

28
< p >< code > stdout < /code > 会在换行符时刷新。由于你的 < code > print! < /code > 语句不包含也不以换行符结尾,因此它不会被刷新。你需要使用 < code > std::io::stdout().flush() < /code > 手动刷新。

例如

use std::io::{self, Write};

fn main() {
    let mut input = String::new();
    print!("Enter a string >> ");
    let _ = io::stdout().flush();
    io::stdin().read_line(&mut input).expect("Error reading from STDIN");
}

2
我认为这个工作还需要在范围内的Write trait。use std::io::Write;(引用flush()方法) - jabgibson

4
你应该能够在同一行上写出输出并获取输入。在stdinstdout中没有“同一行”的概念,只有不同的流,如果你想进行终端操作,应该使用像console这样处理终端的工具。
在Python(3.x)中,这可以通过一行代码实现,因为输入函数允许在STDIN提示之前提供字符串参数:variable = input("Output string") 好了,就是这样。
use dialoguer::Input;

let name = Input::new().with_prompt("Your name").interact()?;
println!("Name: {}", name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接