rust - 我在C++'s ` std::cin >>`的Rust模拟中缺少哪个特殊情况?

标签 rust

我的计划是编写一个简单的方法,该方法完全可以执行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_bufconsume之类的东西替换了read_lineread_string对。

关于rust - 我在C++'s ` std::cin >>`的Rust模拟中缺少哪个特殊情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62035685/

相关文章:

rust - 如何消除同名特征之间的歧义?

rust - 有没有办法链接结果映射和展开?

rust - 了解范围和阴影匹配

performance - 迭代器中的 "Recycling"项以获得更好的性能

macos - 从 dylib 返回时 macOS 上的段错误

rust - 如何自动公开模块目录中的所有 .rs 文件?

rust - 如何指定特征的所有实现者也必须实现序列化?

rust - 惯用的 rust 代码是否总是避免使用 'unsafe'?

rust - 迭代递归结构时无法获取可变引用 : cannot borrow as mutable more than once at a time

oop - 如何在没有代码冗余的情况下表示两个真正相似的结构?