В C getc()
и ungetc()
используют глобальный FILE *
с именем stdin
, что позволяет затем буферизовать ввод. В ржавчине это похоже, stdin.lock()
даст вам StdinLock
, которые реализуют Bufread
, AFAIK нет встроенного способа делать то, что вы хотите, люди будут просто использовать lines()
. Кроме того, ваше требование сложнее, чем кажется, вы запрашиваете поток Unicode, в то время как ваша функция C не заботится об этом.
Итак, вот базовое решение:
use std::io;
use std::io::prelude::*;
use std::str;
fn main() {
let stdin = io::stdin();
let mut stdin = stdin.lock();
while let Ok(buffer) = stdin.fill_buf() {
let (input, to_consume) = match str::from_utf8(buffer) {
Ok(input) => (input, input.len()),
Err(e) => {
let to_consume = e.valid_up_to();
if to_consume == 0 {
break;
}
let input = unsafe { str::from_utf8_unchecked(&buffer[..to_consume]) };
(input, to_consume)
}
};
println!("{}", input);
// here you could do many thing like .chars()
stdin.consume(to_consume);
}
}