Как напечатать STDOUT и получить STDIN на той же строке в Rust? - PullRequest
0 голосов
/ 19 января 2019

Макросы 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")

Я разделил задачу на макрос print и функцию read_line после сбоянайдите решение в документации Rust, которое позволило бы что-то похожее на пример Python.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

вы должны быть в состоянии записать вывод и получить ввод в одной строке.

В stdin и stdout отсутствует понятие "одна и та же строка".Есть только другой поток, если вы хотите выполнить манипулирование терминалом, вы должны использовать что-то, что обрабатывает терминал, например console .

В Python (3.x) это может бытьвыполняется одной строкой, потому что функция ввода допускает строковый аргумент, который предшествует подсказке STDIN: variable = input("Output string")

Ну, вот, пожалуйста:

use dialoguer::Input;

let name = Input::new().with_prompt("Your name").interact()?;
println!("Name: {}", name);
0 голосов
/ 19 января 2019

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