4 个版本
0.2.0 | 2023年6月2日 |
---|---|
0.1.2 | 2023年1月13日 |
0.1.1 | 2023年1月12日 |
0.1.0 | 2023年1月11日 |
#1392 in 文本处理
44 每月下载量
28KB
534 代码行
token-read
这是一个简单的crate,允许轻松解析空白分隔文件。
它主要用于竞技编程,在这种编程中,由于C和C++易于解析,此类文件常用作输入。这个crate旨在将这种便捷性带到Rust中。
示例
要查看完整程序,请参阅源代码仓库中的示例。
初始化
可以从任何实现 BufRead
的类型(例如文件、标准输入或字节数组)构建一个 TokenReader
。
处理错误的最简单方法是使用 anyhow。
use std::io::stdin;
use anyhow::Result;
use token_read::TokenReader;
fn main() -> Result<()> {
let mut input = TokenReader::new(stdin().lock());
// Do IO and computation
Ok(())
}
读取一个或多个值
可以使用 line
函数读取实现 FromStr
的一个或多个值的元组。
let (budget, ): (u64, ) = input.line()?;
let (product, cost): (String, u64) = input.line()?;
示例输入
10000
Sandwich 80
读取原始行
为了读取没有任何修改的行,可以使用 line_raw
函数。
let sentence: String = input.line_raw()?;
示例输入
All human beings are born free and equal in dignity and rights.
读取值集合
line
函数还可以用于将实现 FromStr
的类型的可变数量值读取到大多数标准集合中。
let temperatures: Vec<f64> = input.line()?;
let allowed_letters: HashSet<char> = input.line()?;
示例输入
18.7 19.2 19.4 18.9
A B E I J M N
读取多行
可以使用 take
函数创建一个迭代器,它消耗特定数量的行。您可以使用它来创建一个简单的 for
循环。
let (city_count, ): (usize, ) = input.line()?;
for city in input.take(city_count) {
let (name, population): (String, u64) = city?;
}
或者,它也可以收集到任何数据结构中。
let (city_count, ): (usize, ) = input.line()?;
let cities: Vec<(String, u64)> = input.take(city_count).collect::<Result<_, _>>()?;
在不需要将输入存储在内存中的情况下,可以使用 take_count
代替,因为它允许比 usize
能够容纳的更大的行数。
let (city_count, ): (u64, ) = input.line()?;
for city in input.take_count(city_count) {
let (name, population): (String, u64) = city?;
}
示例输入
3
Prague 1309000
New York 8468000
Tokio 13960000
安装
此crate可在crates.io上找到。要安装,只需运行
cargo add token-read
依赖项
~0.4–0.8MB
~19K SLoC