Ошибка с файлом IO в C ++. прекращение вызова после создания экземпляра 'std :: length_error' what (): basic_string :: resize

0

Я пытаюсь взять некоторую информацию из файла, а затем ввести ее в три отдельных массива. информация находится в следующем формате: 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();
}
  • 1
    std :: string не являются символьными массивами с нулевым символом в конце. Прекратите обращаться с ними так, как они: name.resize((len-1)); name[len]='\0'; Нет смысла вставлять пустые значения в конец std :: string (и, в довершение всего, ваш индекс выходит за пределы).
  • 0
    Это решило проблему. Большое спасибо!
Теги:
file-io

2 ответа

0
Лучший ответ

Я думаю, ваша проблема в том, что вы смешиваете 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]);
   }

}
0

Кажется, это проблема для меня. Вы просто resize строки и помещаете что-то в измененный размер. Фактически два больше, чем распределенный размер.

Если распределение равно 20, то приведенное ниже выражение пытается помещать 22 ю ячейку памяти.

name.resize((len-1));
name[len]='\0';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню