使用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(); }
错误原因
- 循环逻辑缺陷:
while (!Auftraege.eof())的判断逻辑有问题——当文件读取到末尾时,eof()不会立即触发,最后一次getline会读取失败,导致MengeanAuftraegen变成空字符串,此时调用std::stoi转换空字符串就会抛出异常。 - 未处理
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
相关产品推荐
相关产品推荐

