You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:34:23