是否可以从`io :: stdin()`中读取字符而无需逐行缓存输入?

时间:2015-09-13 12:42:31

标签: string rust stdin

此问题涉及稳定的Rust版本 1.2.0

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

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

是否有另一种可能不那么明显的方法来读取stdin char-by-char而不需要任何额外的Rust端缓冲?

1 个答案:

答案 0 :(得分:3)

Aaronepower's answer对于您可能关心的情况是正确的, ASCII字符。我想用你的措辞来解决这个问题:

  

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

在Rust中,char是32位(4字节)类型,表示Unicode代码点。但是,IO抽象在字节级别上运行。您需要使用某种类型的编码将代码点映射到字节序列,并且该战争中的当前赢家是UTF-8。

UTF-8将使用maximum of 4 bytes来表示单个代码点,但采用与本机不同的位模式。要正确阅读逐个字符,总是需要有某种缓冲区。

然后问题是在缓冲区的末尾有一个部分字符需要移回缓冲区的开头,这是相对昂贵的。最好的解决方案是将成本分摊到很多字符上,这样就可以更快地读取更大的字符串。