54

トークナイザーを作るつもりです。ユーザーが入力したすべての行を読み取り、ユーザーがCtrl+を押したら読み取りを停止する必要がありますD

私は周りを検索し、コンパイルすらしないRustIOの例を1つだけ見つけました。ioモジュールのドキュメントを調べたところ、read_line()関数がReaderUtilインターフェイスの一部であることがわかりましたstdin()が、代わりに戻りますReader

私が望むコードは、基本的にC++では次のようになります。

vector<string> readLines () {
    vector<string> allLines;
    string line;

    while (cin >> line) {
        allLines.push_back(line);
    }

    return allLines;
}

この質問は、Rust 1.0より前のRustの部分に言及していますが、一般的な概念はRust1.0でも引き続き有効です。

4

8 に答える 8

13

2015 年 4 月 17 日現在、mdcoxFirefox Rust IRCチャンネルから。

use std::io;

fn main() {
    let mut stdin = io::stdin();
    let input = &mut String::new();

    loop {
        input.clear();
        stdin.read_line(input);
        println!("{}", input);
    }
}
于 2015-04-17T22:37:59.507 に答える
2

Rust 0.4では、ReaderUtilトレイトを使用して関数にアクセスしread_lineます。値を特性タイプに明示的にキャストする必要があることに注意してください。次に例を示しreader as io::ReaderUtilます。

fn main() {
    let mut allLines = ~[];
    let reader = io::stdin();

    while !reader.eof() {
            allLines.push((reader as io::ReaderUtil).read_line());
    }

    for allLines.each |line| {
            io::println(fmt!("%s", *line));
    }
}

この回答はRust1.0よりも前のものです。最新のソリューションについては、他の回答を参照してください。

于 2012-11-28T09:50:49.893 に答える
2

ええと...試行錯誤の末、解決策を見つけました。

私はまだより良い解決策を見たいので、私自身の解決策を受け入れるつもりはありません.

以下のコードは、ユーザーが入力したものを正確に出力します。

mod tokenizer {

    pub fn read () -> ~[int] {
        let reader = io::stdin();
        let mut bytes: ~[int] = ~[];

        loop {
            let byte: int = reader.read_byte();
            if byte < 0 {
                return bytes;
            }
            bytes += [byte];
        }
    }
}

fn main () {
    let bytes: ~[int] = tokenizer::read();
    for bytes.each |byte| {
        io::print(#fmt("%c", *byte as char));
    }
}

この回答はRust 1.0よりも前のものです。最新のソリューションについては、他の回答をご覧ください。

于 2012-11-27T08:12:59.577 に答える