Как читать и читать непонятные символы Юникода из stdin в Rust? - PullRequest
0 голосов
/ 16 июня 2019

В C вы используете getc и ungetc для чтения байтов с ожиданием парсеров.

Какой идиоматический способ сделать это в Rust с символами Unicode?

Iпробовал io::stdin().chars() но похоже какая-то проблема, я не понимаю.Компилятор жалуется на его использование.

1 Ответ

1 голос
/ 16 июня 2019

В 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...