如何修复抛出std::out_of_range实例后调用的terminate

How to fix terminate called after throwing an instance of std::out_of_range

本文关键字:实例 调用 terminate range of std 何修复 out      更新时间:2023-10-16

留言如下:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::erase: __pos (which is 18446744073709551615) > this->size() (which is 22)
Aborted (core dumped)

下面是我到目前为止的代码(它应该在一个混乱的数据文件中重新格式化名称,日期和金额,使其看起来像:

Foster, Jerry Lee 1995   329,475

//This program reformats the retirement account data file oldretirement.txt and outputs the data into a new file newretirement.txt

#include<iostream>
#include<cstdlib>
#include<fstream>
#include<cctype>
#include<string>
#include<cstring>
#include<cstddef> 
using namespace std;
void getridof(string &line);
int splitamount(string &line);
int splityear(string &line);
string splitfullname(string &line);
int main(){
 ifstream fin;
 ofstream fout;
 string line;
 string finalname;
 size_t found;
 int finalamount;
 int finalyear;
 fin.open("oldretirement.txt");
 if(fin.fail())
  {cout<< "input file failed to open. n";
   exit (1);}
 fout.open("newretirement.txt");
 if(fout.fail())
  {cout<<"output file failed to open.n";
   exit (1);}
while(!fin.eof()){
 getline(fin,line);
// getridof(line); 
 finalamount = splitamount(line);
 finalyear = splityear(line);
 getridof(line);
// found = line.find(",");
// if(found!=string::npos)
 // {finalname = line;}
// else
 // {finalname = splitfullname(line);} 
fout << finalname << finalyear << finalamount << endl;
}
fin.close();
fout.close();
}

void getridof(string &line){
 int location = 0;
 location=line.find("Account$:");
cout << location << endl;
 if(location != 0){
 // location=line.find("Account$:");
  line.erase(location,9);}
 cout<< "get rid of a " << line << endl;
location = line.find("born:");
 if(location != -1){
 // location=line.find("Account$:");
  line.erase(location,5);}
 cout<< "get rid of b " << line << endl;
return;
}
int splitamount(string &line){
 int a;
 size_t found = -1;
 int num_len;
 line.erase(line.find_last_of(","),1);
 cout << "amount a " <<  line << endl;
 found=line.find_last_of((" "));
 num_len=line.length()-found;
 char amount[num_len];
 for(int i=0;i<num_len;i++){
 amount[i] = line[found + 1 + i];
 }
 line=line.substr(0,found);
cout << "amount b " << line<< endl;
 a=atoi(amount);
cout << "amount c "  << a << endl;
 return a;
}
int splityear(string &line){
 char year[4];
 int y;
 size_t found = -1;
cout << "split year a " << line << endl;
 found =  line.find_first_of("1",1);
 for(int i=0;i<4;i++){
year[i] = line[found+i];
 }
 line=line.erase(found,4);
 y=atoi(year);
cout << "split year b " << line << endl;
cout << "split year c " << y << endl;
 return y;
}
string splitfullname(string &line){
 string last;
 string rest = ", ";
 string fullname;
 size_t found = -1;
 found = line.find_last_of(" ");
 last = line.substr(found+1);
// line.erase(found,string::npos);
 rest.insert(3,line);
 fullname = last + rest;
 return fullname;
}
//temp=line.substr(line.first_of("1",0))
//get today's date and subtract integer version of birth dates in data from today's date. (finalyear atoi) (age = currentyear-intyear) do in main.

变化:

if(location != 0){

if(location != string::npos){

如果没有找到匹配的std::string::find(),该函数返回string::nposnpos是一个静态成员常量值,具有size_t类型元素的最大可能值。

这就是您看到18446744073709551615值的原因, std::out_of_range ' .