以下是信息:
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.
答案 0 :(得分:0)
更改:
if(location != 0){
到
if(location != string::npos){
如果std::string::find()
未找到匹配项,则函数返回string::npos
。 npos
是一个静态成员常量值,对于size_t类型的元素,最大可能值。
这就是您看到18446744073709551615
std :: out_of_range`的原因
的原因。