【问题标题】:How do I print STDOUT and get STDIN on the same line in Rust? [duplicate]如何在 Rust 的同一行打印 STDOUT 并获取 STDIN? [复制]
【发布时间】:2019-02-22 04:28:07
【问题描述】:

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 函数。

【问题讨论】:

  • 您是否尝试过在print! 语句之后刷新输出?通常标准输出会在换行符上刷新。 stdout().flush();
  • 我没有刷新 STDOUT。在进一步阅读文档后,我现在看到在使用 print 宏时必须手动刷新 STDOUT,因为在遇到换行符之前它不会被隐式刷新。非常感谢您的帮助,@belst!随意发布它作为答案,我会接受它作为最佳答案。

标签: rust stdout stdin


【解决方案1】:

stdout 在换行符上被刷新。由于您的 print! 语句不包含也不以换行符结尾,因此它不会被刷新。您需要使用std::io::stdout().flush()手动完成此操作

例如

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");
}

【讨论】:

  • 我相信 Write trait 也需要在这个范围内才能工作。 use std::io::Write; (引用flush()方法)
【解决方案2】:

您应该能够在同一行编写输出和获取输入。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多