#competitive-programming #white-space #parser #input #delimited #reading #intended

token-read

一个用于读取空白分隔文件的库,旨在用于竞技编程

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 每月下载量

MIT/Apache

28KB
534 代码行

token-read

Crates.io version License GitHub last commit GitHub issues

这是一个简单的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