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

时间:2016-11-13 04:50:26

标签: c++ string terminate

以下是信息:

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.

1 个答案:

答案 0 :(得分:0)

更改:

if(location != 0){

if(location != string::npos){

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

这就是您看到18446744073709551615 std :: out_of_range`的原因 的原因。