Я пытаюсь взять некоторую информацию из файла, а затем ввести ее в три отдельных массива. информация находится в следующем формате: teanmane, вероятность1, вероятность2 Теперь он получает информацию из файла о входных данных в три отдельные строки, но затем дает вышеприведенную ошибку и выгружает ядро и завершает работу. Я понимаю, почему. Ниже приведен код.
string teamname[8];
double p1[8];
double p2[8];
void input()
{
ifstream file;
char fileName[20];
cin>>fileName;
int arrindex=0;
file.open(fileName);
while(!file.eof())
{
int len;
string line;
string name;
string buffer;
string buffer2;
stringstream temp;
stringstream temp2;
stringstream temp3;
double probTg;
double probFg;
getline(file, line);
cout<<line<<endl;
temp<<line;
temp>>name;
len=name.length();
name.resize((len-1));
name[len]='\0';
temp>>buffer;
buffer.resize(4);
temp2<<buffer;
temp2>>probTg;
temp>>buffer2;
buffer2.resize(4);
temp3<<buffer2;
temp3>>probFg;
if(arrindex<8)
{
teamname[arrindex]=name;
cout<<teamname[arrindex];
p1[arrindex]=probTg;
cout<<p1[arrindex];
p2[arrindex]=probFg;
cout<<p2[arrindex];
arrindex++;
}
}
file.close();
}
Я думаю, ваша проблема в том, что вы смешиваете stl-идиомы с c-id.
Приведенный ниже код заменяет ваш анализ строк на scanf. Я думаю, что это намного яснее, чем тот же код, что и для операторов << и >>.
string teamname[8];
double p1[8];
double p2[8];
void input()
{
ifstream file(filename);
if (file.bad()) return 1;
int ix = 0;
while (ix < 8) {
if (file.eof())
break;
string line;
getline(file, line);
char * team;
double d1, d2;
int fields = sscanf(line.c_str(), "%a[a-zA-Z], %lf, %lf", &team, &p1[ix], &p2[ix]);
if (fields >= 1) {
teamname[ix] = team;
free(team);
}
++ix;
}
file.close();
for (ix = 0; ix < 8; ++ix) {
printf("%s %f %f\n", teamname[ix].c_str(), p1[ix], p2[ix]);
}
}
Кажется, это проблема для меня. Вы просто resize
строки и помещаете что-то в измененный размер. Фактически два больше, чем распределенный размер.
Если распределение равно 20
, то приведенное ниже выражение пытается помещать 22
ю ячейку памяти.
name.resize((len-1));
name[len]='\0';
name.resize((len-1)); name[len]='\0';
Нет смысла вставлять пустые значения в конец std :: string (и, в довершение всего, ваш индекс выходит за пределы).