在Visual Studio 2017中使用stoi()的异常未递
Exception Unhanded using stoi() in Visual Studio 2017
我在尝试在Visual Studio 2017中制作的程序中遇到了一些问题。 这个问题似乎源于我在"load_pokemon"函数中使用了"stoi()"函数。 当我尝试运行该程序时,我收到以下错误:
Unhandled exception at 0x74A2A932 in ConsoleApplication1.exe: Microsoft C++
exception: std::invalid_argument at memory location 0x010EE918.
有问题的函数在这里(应该假设口袋妖怪类与所有成员函数一起功能齐全,因为我相信我对"stoi"的使用是罪魁祸首):
void load_pokemon(Pokemon pokemon[]) {
ifstream input_file;
string file_name;
int i = 0;
string temp;
int number;
cout << "nnEnter Pokemon Data File Name: ";
cin >> file_name;
input_file.open(file_name.c_str());
while (!input_file.eof()) {
input_file >> temp;
pokemon[i].assign_name(temp);
temp.clear();
input_file >> temp;
pokemon[i].assign_type_1(temp);
temp.clear();
input_file >> temp;
pokemon[i].assign_type_2(temp);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_health_base(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_health_multiplier(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_attack_base(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_attack_multiplier(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_s_attack_base(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_s_attack_multiplier(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_defence_base(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_defence_multiplier(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_s_defence_base(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_s_defence_multiplier(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_speed_base(number);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_speed_multiplier(number);
temp.clear();
input_file >> temp;
pokemon[i].assign_move_1(temp);
temp.clear();
input_file >> temp;
pokemon[i].assign_move_1_effect(temp);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_move_1_max_pp(number);
temp.clear();
input_file >> temp;
pokemon[i].assign_move_2(temp);
temp.clear();
input_file >> temp;
pokemon[i].assign_move_2_effect(temp);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_move_2_max_pp(number);
temp.clear();
input_file >> temp;
pokemon[i].assign_move_3(temp);
temp.clear();
input_file >> temp;
pokemon[i].assign_move_3_effect(temp);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_move_3_max_pp(number);
temp.clear();
input_file >> temp;
pokemon[i].assign_move_4(temp);
temp.clear();
input_file >> temp;
pokemon[i].assign_move_4_effect(temp);
temp.clear();
input_file >> temp;
number = stoi(temp);
pokemon[i].assign_move_4_max_pp(number);
temp.clear();
i++;
}
return;
}
在文件中测试读取:
Bulbasaur grass poison 3 2 4 2 5 3 4 2 5 3 3 2 Tackle physical 5 Vine_Whip
physical 3 Synthesis heal 2 Poison_Powder poison 2
Ivysaur grass poison 4 2 5 2 6 3 5 2 6 3 4 2 Double-Edge physical 5
Vine_Whip physical 3 Synthesis heal 2 Poison_Powder poison 2
如果无法执行转换,stoi
函数将引发异常。
我建议您使用调试器并检查字符串变量的内容。
此外,还应添加代码来捕获异常并处理它。
您可以随时尝试这样的代码:
int health_modifier;
input_file >> health_modifier;
pokemon[i].assign_health_modifier(health_modifier);
如果读取失败,流将不会处于good
状态。 因此,请在读取后检查input_file
的状态(对所有读取都是一个好主意)。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 有人知道为什么在开关中使用stoi函数会返回恒定的错误吗
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 使用 stoi 功能进行异常处理
- 我一直得到'std::invalid_argument'什么():似乎无缘无故地抛出 stoi 异常?
- 在Visual Studio 2017中使用stoi()的异常未递
- 寻求与类型为 std::invalid_argument 的未捕获异常相关的运行时错误的建议: stoi:无转换