Rust中如何从文件读取整数行并解析为Vec<i32>?
错误原因
触发ParseIntError { kind: Empty }的直接原因是,lines()迭代器产出了空字符串,尝试将空字符串解析为i32就会报这个错。
常见触发场景:
- 文本文件末尾通常会被编辑器自动追加一个换行符,
lines()会把最后一个换行符之后的空内容识别为独立的空行 - 某一行存在首尾空白字符(比如Windows换行残留的
\r、行尾误加的空格),也可能导致解析失败
修复方法
解析前先对每行做首尾空白去除,过滤掉空行即可,同时建议给parse操作加更明确的错误提示,方便定位问题。
修正后的完整代码:
use std::fs::File; use std::io::Read; fn main() { let mut file = File::open("numbers.txt").expect("Can't open file!"); let mut contents = String::new(); file.read_to_string(&mut contents).expect("Unable to read file content."); let mut vec_numbers = Vec::new(); for line in contents.lines() { let trimmed = line.trim(); // 跳过空行 if trimmed.is_empty() { continue; } let num = trimmed.parse::<i32>() .expect(&format!("Failed to parse integer from content: '{}'", trimmed)); vec_numbers.push(num); } }
如果偏好函数式迭代器写法,可以简化成:
let vec_numbers: Vec<i32> = contents .lines() .map(str::trim) .filter(|line| !line.is_empty()) .map(|line| { line.parse::<i32>() .expect(&format!("Invalid integer: {}", line)) }) .collect();
补充说明:如果你实际存储的数字是空格分隔而非严格每行一个,可以直接用split_whitespace()按所有空白字符分割,不用遍历行,写法更简单,也自动兼容空行、多空格、换行混排的情况:
let vec_numbers: Vec<i32> = contents .split_whitespace() .map(|s| s.parse::<i32>().expect(&format!("Invalid number: {}", s))) .collect();
内容的提问来源于stack exchange,提问作者Yangie Kuo
相关产品推荐
相关产品推荐

