やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustでprintとread_lineを1行にする方法

 printはflushする必要がある。

成果物

問題

 以下のように1行で標準出力+標準入力したい。

値を入力してください: <stdin待ち>

解決

use std::io;
use std::io::Write;

fn main() {
    print!("任意の値を入力してください: ");
    io::stdout().flush().unwrap(); 
    let mut guess = String::new();
    io::stdin().read_line(&mut guess)
        .expect("入力エラー。read_line()で失敗しました。");
}

ポイント

  • println!でなくprint!を使って末尾から改行を省く
  • flush()を使ってprint!を即時出力する

NG集

println!

 2行になってしまう。

use std::io;

fn main() {
    println!("値を入力してください: ")
    let mut value = String::new();
    io::stdin().read_line(&mut value)
        .expect("入力エラー。read_line()で失敗しました。");
}
値を入力してください:
<stdin待ち>

print!

 入力が確定されるまで標準出力されない。

use std::io;

fn main() {
    print!("値を入力してください: ")
    let mut value = String::new();
    io::stdin().read_line(&mut value)
        .expect("入力エラー。read_line()で失敗しました。");
}
<stdin待ち>

 何かを入力すると以下のように表示される。

値を入力してください: <stdin入力値>

 いやいや、「値を入力してください」は入力確定する前に表示してくれよ……。

対象環境

$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux

参考

前回まで