【问题标题】:How to read a list of numbers from a file into a Vec?如何将文件中的数字列表读入 Vec?
【发布时间】:2020-12-02 00:19:31
【问题描述】:

我正在尝试使用 Rust 将文件中的数字列表(每行都有一个数字)读入Vec<i64>。我可以使用BufReader 从文件中获取作为字符串加载的数字。但是,我似乎无法从 Result 枚举中获取字符串的值,它们由 BufReader 包裹。

那么如何从Result 中获取这些值进行解析,以便他们可以使用字符串以外的其他类型填充Vec

我尝试过的:

  1. 使用for 循环,我可以打印值以证明它们在那里,但是当我尝试使用numbers.append(...) 行编译时,它会在解析时出现恐慌。
fn load_from_file(file_path: &str) {
    let file = File::open(file_path).expect("file wasn't found.");
    let reader = BufReader::new(file);
    let numbers: Vec<i64> = Vec::new();

    for line in reader.lines() {
        // prints just fine
        println!("line: {:?}", line);
        numbers.append(line.unwrap().parse::<i64>());
    }
}
  1. 另外,我尝试了映射,但在将值放入我尝试填充的 Vec&lt;i64&gt; 时遇到了同样的问题。
fn load_from_file(file_path: &str) {
    let file = File::open(file_path).expect("file wasn't found.");
    let reader = BufReader::new(file);

    let numbers: Vec<i64> = reader
        .lines()
        .map(|line| line.unwrap().parse::<i64>().collect());
}

这不是How to do error handling in Rust and what are the common pitfalls?单独解决的

【问题讨论】:

  • 这是一个内容丰富的问题​​,但无助于解决我的问题或讨论 Result、BufReader 等
  • 它概括了错误处理,主要使用Results。它涵盖了.unwrap()、用于传播错误的? 运算符(Ok/Err 匹配的简写)和其他转换函数。没错,它没有直接回答您,但我希望它为您提供了将来处理错误所需的工具。 .unwrap() 是一个生硬的工具,并不总是最好的选择。
  • @kmdreko 感谢您的解释,这是一个非常有帮助的问题/答案。对于那些刚接触 Rust 的人来说,很难从这些信息中提取出解决此类问题所需的信息。这就是为什么我认为这两个问题都很有价值,而且还不够接近,无法重复在其他地方回答。不过,我确实看到了它们之间的密切关系。

标签: vector rust file-io enums numbers


【解决方案1】:

您可以在Result 枚举上调用unwrap() 方法以从中获取值。固定示例:

use std::fs::File;
use std::io::BufReader;
use std::io::BufRead;

fn load_from_file(file_path: &str) {
    let file = File::open(file_path).expect("file wasn't found.");
    let reader = BufReader::new(file);

    let numbers: Vec<i64> = reader
        .lines()
        .map(|line| line.unwrap().parse::<i64>().unwrap())
        .collect();
}

playground

【讨论】:

  • 所以你必须解开 line 来解析它,然后在地图内再次解开以收集值?介意解释一下为什么你解开两次?谢谢
  • @CoderLee .lines() 适用于任何缓冲读取器,这意味着个别行可能因 IO 原因而失败。将字符串解析为 i64 也可能会失败。由于它们都容易出错,它们都返回必须处理的Results(在这种情况下通过.unwrap()
猜你喜欢
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多