Как избежать буферизации на stdin и stdout?

При чтении из std::io::stdin()входные данные буферизуются до EOF встречается. Я хотел бы обрабатывать строки по мере их поступления, а не ждать, пока все буферизуется.

Дана функция оболочки bar это работает echo bar каждую секунду, я проверяю это с bar | thingy, Он ничего не напечатает, пока я ^C,

Вот с чем я сейчас работаю:

use std::io;
use std::io::timer;
use std::time::Duration;

fn main() {
    let mut reader = io::stdin();
    let interval = Duration::milliseconds(1000);

    loop {
        match reader.read_line() {
            Ok(l) => print!("{}", l),
            Err(_) => timer::sleep(interval),
        }
    }
}

1 ответ

Решение

При чтении из std::io::stdin() ввод буферизуется до тех пор, пока не встретится EOF

Почему ты говоришь это? Ваш код работает так, как вы хотите. Если я скомпилирую и запусту это:

$ ./i
hello
hello

goodbye
goodbye

yeah!
yeah!

Первая из каждой пары строк - я набираю в терминале и нажимаю Enter (вот что read_line ищет). Второе - это то, что выводит ваша программа.

Err(_) => timer::sleep(interval)

Это плохая идея - когда вход закрыт (например, с помощью ^D), ваша программа не заканчивается.

редактировать

Я создал скрипт bar:

#!/bin/bash

set -eu

i=0

while true; do
    echo $i
    sleep 1
done

А потом запустил это:

./bar | ./i
0

0

0

Ваша программа продолжает работать.

Другие вопросы по тегам