gpt4 book ai didi

file - 从文件中获取数字并放入 Vec 但不断出错

转载 作者:行者123 更新时间:2023-12-03 11:35:57 25 4
gpt4 key购买 nike

代码:

use std::io::Read;

fn main() {
let mut file = std::fs::File::open("numbs").unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
let mut v: Vec<i32> = Vec::new();
for s in contents.lines() {
v.push(s.parse::<i32>().unwrap());
}
}

错误:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: Empty }', src/libcore/result.rs:1165:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

最佳答案

很可能,您有一个尾随换行符 \n在文件的末尾,即最后一行是空的。您的文件中间可能还有空行。

为您的用例解决此问题的最简单方法是忽略空行:

for s in contents.lines() {
if !s.is_empty() {
v.push(s.parse::<i32>().unwrap());
}
}

然而,仅仅 unwrap 通常不是一个好主意。一个 Result特别是如果你不能保证它永远不会 panic 。更稳健的解决方案是处理 Result 的每个可能结果。适本地。此解决方案的另一个优点是它不仅会忽略空行,还会忽略无法解析为 i32 的字符串。 .这是否是您想要的,或者您是否希望明确处理此错误取决于您。在以下示例中,我们将使用 if-let 仅在成功解析为 i32 的情况下将值插入向量中。 :

for s in contents.lines() {
if let Ok(i) = s.parse::<i32>() {
v.push(i);
}
}

旁注:您不需要将整个文件读入字符串然后逐行解析。引用 Read large files line by line in Rust看看如何更惯用地实现这一点

结合上述观点和 flatten的使用和 flat_map ,我们可以将逻辑大大简化为:

use std::fs::File;
use std::io::{BufRead, BufReader};

fn main() {
let file = File::open("numbs").unwrap();
let v: Vec<i32> = BufReader::new(file)
.lines()
.flatten() // gets rid of Err from lines
.flat_map(|line| line.parse::<i32>()) // ignores Err variant from Result of str.parse
.collect();
}

关于file - 从文件中获取数字并放入 Vec<i32> 但不断出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59710472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com