首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不逐行缓存输入的情况下,可以从‘it::stdin()’读取字符吗?

在不逐行缓存输入的情况下,可以从‘it::stdin()’读取字符吗?
EN

Stack Overflow用户
提问于 2015-09-13 12:42:30
回答 3查看 2.6K关注 0票数 3

这个问题指的是稳定的锈菌版本1.2.0

我只想迭代我的CLI应用程序的标准输入中的字符。完全可以将stdin线路方法读入临时的String实例,然后在它的chars()迭代器上进行迭代。

但是我不喜欢这种方法,因为它分配了一个完全不必要的String对象。Stdin特性的文档实现了Read特性,它有 chars()迭代器,但是它被标记为不稳定(因此不能与稳定的编译器版本一起使用)。

有没有另一种不太明显的方法去阅读stdin char-by-char而不需要任何额外的锈边缓冲?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-13 13:59:59

您可以通过拥有一个字节数组并继续读取直到Result变成一个Err来做到这一点。但是,这有一个问题,因为如果您没有阅读ASCII字符,这可能会成为问题。如果要解决这个问题,最好只分配一个String,并使用chars迭代器,因为它处理这个问题。

样本代码:

代码语言:javascript
复制
use std::io::{stdin, Read};

fn main() {
    loop {
        let mut character = [0];
        while let Ok(_) = stdin().read(&mut character) {
            println!("CHAR {:?}", character[0] as char);
        }
    }
}

样本输出:

代码语言:javascript
复制
Hello World
CHAR Some('H')
CHAR Some('e')
CHAR Some('l')
CHAR Some('l')
CHAR Some('o')
CHAR Some(' ')
CHAR Some('W')
CHAR Some('o')
CHAR Some('r')
CHAR Some('l')
CHAR Some('d')
CHAR Some('\n')
你好世界
CHAR Some('\u{e4}')
CHAR Some('\u{bd}')
CHAR Some('\u{a0}')
CHAR Some('\u{e5}')
CHAR Some('\u{a5}')
CHAR Some('\u{bd}')
CHAR Some('\u{e4}')
CHAR Some('\u{b8}')
CHAR Some('\u{96}')
CHAR Some('\u{e7}')
CHAR Some('\u{95}')
CHAR Some('\u{8c}')
CHAR Some('\n')
票数 5
EN

Stack Overflow用户

发布于 2015-09-13 15:04:41

对于您可能关心的情况,XAMPPRocky的回答是正确的,ASCII字符。我想按照你的措辞来回答这个问题:

我只想迭代我的CLI应用程序的标准输入中的字符。

在Rust中,char是一种32位(4字节)类型,表示Unicode编码点.但是,IO抽象在字节级别上运行。你需要带来某种编码,把编码点映射到字节序列,而当前的胜利者是UTF-8。

UTF-8将使用最大4字节来表示单个代码点,但使用的是与本机不同的位模式。要正确逐字读取,您将始终需要某种缓冲区.

还有一个问题,就是在缓冲区的末尾有一个部分字符,需要移回缓冲区的开头,这是比较昂贵的。最好的解决方案是对许多字符的成本进行摊还,因此,为什么以更大的块进行阅读会更快。

票数 4
EN

Stack Overflow用户

发布于 2022-02-12 12:22:30

对于那些来自未来的人,我们在fn bytes(self) -> Bytes<Self>](链接)中使用了std::io::Read,它允许我们以一种更优雅的方式重新实现XAMPPRocky码

代码语言:javascript
复制
use std::io::{Read, stdin};

fn main() {
    for c in stdin().bytes().map(|x| x.expect("cannot read char from stdin")) {
        println!("CHAR {}", char::from(c));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32549784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档