我的计划是编写一个简单的方法,该方法完全可以执行C++标准库中的std::cin >>
的工作:
use std::io::BufRead;
pub fn input<T: std::str::FromStr>(handle: &std::io::Stdin) -> Result<T, T::Err> {
let mut x = String::new();
let mut guard = handle.lock();
loop {
let mut trimmed = false;
let available = guard.fill_buf().unwrap();
let l = match available.iter().position(|&b| !(b as char).is_whitespace()) {
Some(i) => {
trimmed = true;
i
}
None => available.len(),
};
guard.consume(l);
if trimmed {
break;
}
}
let available = guard.fill_buf().unwrap();
let l = match available.iter().position(|&b| (b as char).is_whitespace()) {
Some(i) => i,
None => available.len(),
};
x.push_str(std::str::from_utf8(&available[..l]).unwrap());
guard.consume(l);
T::from_str(&x)
}
loop
的意思是在有效输入开始之前修剪掉所有空白。循环外部的match
块是计算有效输入的长度(即,在结尾的空格开始或到达EOF
之前)的位置。这是使用上述方法的示例。
let handle = std::io::stdin();
let x: i32 = input(&handle).unwrap();
println!("x: {}", x);
let y: String = input(&handle).unwrap();
println!("y: {}", y);
当我尝试了一些简单的测试时,该方法可以正常工作。但是,当我在在线编程中像在codeforce中那样使用此功能时,我会提示说该程序有时处于空闲状态或输入错误,这导致我怀疑我错过了一个极端案例。或类似的东西。当输入长度为几百行时,通常会发生这种情况。
哪些输入将破坏该方法?更正是什么?
最佳答案
经过大量的实验,我注意到在读取每个输入时会有一个滞后,随着输入数量的增加,这个滞后加起来了。该函数不使用缓冲区。每当需要填充变量时,它都会尝试访问流,这很慢,因此会产生滞后。
获得的经验:请始终使用容量合适的缓冲区。
但是,空闲问题仍然存在,直到我用fill_buf
或consume
之类的东西替换了read_line
和read_string
对。
关于rust - 我在C++'s ` std::cin >>`的Rust模拟中缺少哪个特殊情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62035685/