Ошибка ошибки сегментации при копировании массива в C

#c #file-handling

#c #обработка файлов

Вопрос:

 #include <stdlib.h>
#include<string.h>
typedef struct monster {
    int id;
    char name[64];
    char element[64];
    int population;
    double weight;
} monster;

typedef struct {
    long long int compares;
    long long int copies;
} sort_results;

int main(void) {
  monster m[1000],n;
  sort_results s;
  FILE *file = NULL;
  file = fopen("10.txt", "r");
  if(file==NULL)
    printf("not read");
  int i=0;  
  while(!feof(file)) {
  fscanf(file,"%s %s %d %lf", n.name,n.element,amp;n.population,amp;n.weight);
  n.id = i 1;
   
  /*  this commented code gives error segmenatation fault*/
  // strcpy(m[i].element,n.element);
  // strcpy(m[i].name,n.name);
  // m[i].population = n.population;
  // m[i].weight = n.weight;
  // m[i].id = n.id;

  i  ;
  
   // this is working fine , printing expected result
  printf("%s %s %d %lfn",n.name,n.element,n.population, n.weight);
  }
  printf(" n record count :%d",i);
}
  
 File content

0ybOAtlTP KaRIvi05m 77 1.658986

Zr700nwzB BaFrl3BMN 85 3.019501

SJXVx8seR cMQZZBogi 179 0.237434

n5F30UhgA GPJucKtsW 243 1.082797

BnJBzm9dq NwZKlaEu3 179 5.048067

there is one new line gap in records 
  

1 . это образец из 5 записей, но в файле может быть любое количество записей. Заявление Fscanf работает fine..it читает записи , как и ожидалось . Но существует более одной записи, поэтому я попытался сохранить их в массив, но это выдает ошибку как ошибку сегментирования для прокомментированной части кода.
2. Поскольку не существует какого-либо фиксированного количества записей для чтения, есть ли у них какой-либо способ добиться этого, поскольку каждый раз, когда он встречает новую запись в цикле while, должен быть создан новый блок памяти, некоторая концепция перераспределения и вызова в C. я пытался добиться этого, используя статическое распределение из массива, но мне это нужно как динамическое

Комментарии:

1. Сколько еще таких записей у вас есть в файле? это больше, чем 1000 ?

2. да, у меня есть 5 разных файлов для обработки, имеющих различную длину записи (1000,5000,10000). Но я попробовал этот код только для 5 записей. Все еще выдает ошибку

3. while (!(feof(...)) всегда неверно, и вам нужно проверить возвращаемое значение fscanf ! И если файл не был успешно открыт, вы все равно продолжаете чтение из него…

4. Использование %s очень плохое, так как может переполнить буфер. Использовать cs

5. @DeepakSharma я проверил в своей системе. Я не получил никакой ошибки сегментации. Он работает. Ваш код не включал файл заголовка «stdio.h».