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

使用std::stoi将文本文件数字字符串转为int数组时触发未处理异常

问题描述

尝试读取一个包含三个数字条目的.txt文件,将条目读取为字符串后通过std::stoi转换为int类型并存入int数组,操作失败触发未处理异常,错误标记在string库第107行,疑似问题行是auftraegearray[i++] = std::stoi(MengeanAuftraegen);。

注:条目内容及部分变量名称由作业指定,必须使用std::stoi("string")指令,且未获得该指令的语法说明(与不能偏离讲义内容的要求相悖)。

预期结果是文件中的数字被转换为数组元素,实际运行报错。

代码如下:

int main()
{
    std::fstream Auftraege;
    Auftraege.open("Auftraege37.txt", std::ios::out);
    Auftraege << "10" << std::endl;
    Auftraege << "1" << std::endl;
    Auftraege << "20" << std::endl;
    Auftraege.close();

    int i = 0;
    int auftraegearray[4];
    std::string MengeanAuftraegen;
    Auftraege.open("Auftraege37.txt", std::ios::in);
    while (!Auftraege.eof())
    {
        getline(Auftraege, MengeanAuftraegen);
        std::cout << MengeanAuftraegen << std::endl;
        auftraegearray[i++] = std::stoi(MengeanAuftraegen);

    }

    Auftraege.close();
}
错误原因
  1. 循环逻辑缺陷:while (!Auftraege.eof())的判断逻辑有问题——当文件读取到末尾时,eof()不会立即触发,最后一次getline会读取失败,导致MengeanAuftraegen变成空字符串,此时调用std::stoi转换空字符串就会抛出异常。
  2. 未处理std::stoi的异常:std::stoi在无法将字符串转换为整数(比如空字符串、非数字内容)或转换结果超出int范围时,会分别抛出std::invalid_argument或std::out_of_range异常,原代码没有捕获这些异常,直接触发未处理异常导致崩溃。
修复后的代码
#include <iostream>
#include <fstream>
#include <string>
#include <stdexcept>

int main()
{
    std::fstream Auftraege;
    Auftraege.open("Auftraege37.txt", std::ios::out);
    Auftraege << "10" << std::endl;
    Auftraege << "1" << std::endl;
    Auftraege << "20" << std::endl;
    Auftraege.close();

    int i = 0;
    int auftraegearray[4];
    std::string MengeanAuftraegen;
    Auftraege.open("Auftraege37.txt", std::ios::in);
    
    // 修正循环:仅当成功读取一行时进入循环
    while (getline(Auftraege, MengeanAuftraegen))
    {
        std::cout << MengeanAuftraegen << std::endl;
        try {
            auftraegearray[i++] = std::stoi(MengeanAuftraegen);
        } catch (const std::invalid_argument& e) {
            std::cerr << "转换失败:字符串不是有效整数 - " << e.what() << std::endl;
        } catch (const std::out_of_range& e) {
            std::cerr << "转换失败:数值超出int范围 - " << e.what() << std::endl;
        }
        // 防止数组越界
        if (i >= 4) {
            break;
        }
    }

    Auftraege.close();
    
    // 验证数组内容
    std::cout << "数组存储的数值:";
    for (int j = 0; j < i; j++) {
        std::cout << auftraegearray[j] << " ";
    }
    std::cout << std::endl;
    
    return 0;
}
关键修复点
  • 将循环条件改为while (getline(Auftraege, MengeanAuftraegen)),确保只有成功读取到有效行时才执行转换逻辑,避免处理空字符串。
  • 添加try-catch块捕获std::stoi可能抛出的异常,防止程序直接崩溃并给出错误提示。
  • 增加数组越界检查,避免写入超出数组容量的内存区域。

内容的提问来源于stack exchange,提问作者Mhyra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:55:18